使用TestStack.White进行Windows UI的自动化测试 (1) 基础篇

 参考  https://www.dazhuanlan.com/2019/09/04/8c18f8874287/

本文章将简单介绍TestStack.White这个Windows UI自动化测试的套件,并对一个简单的加法器Windows Form程序进行Windows UI的自动化测试。

前言

前几个月报名了SkillTree的“自动测试与 TDD 实际开发”课程,受到91哥3天的课程洗礼,总算是对Unit Test/TDD/BDD有了比较完整的理解,也终于能够在实际上使用了,虽然很多部分都还在摸索学习中,但也已经从测试先行这个重要观念中得到了很多收获,除了从过去重构时总是绑手绑脚的窘境中解脱之外,开发速度及功能的品质都有所提升。

课堂上91哥对Web的UI Testing介绍花了不少心力,但由于目前工作环境还是有不少系统使用是Windows Form开发,在课程练习中我也询问了是否有类似Selenium的Windows UI Testing的套件,可惜91哥主要研究的是Web的自动测试因此没有得到解答,在自己摸索后发现了TestStack.White的个Windows UI的自动化测试套件,虽然不像Selenium可以轻松录制操作脚本并转成C#测试程序,但对于熟悉Windows Form相关组件的基础上直接用程序操作Windows Form上的组件也不是太困难。除此之外White也有一个名为Screen Objects的类似Web Testing的Page Object Pattern套件可以将UI操作的逻辑再拉出一层抽象层,降低测试逻辑与操作逻辑的耦合性,之后有时间再研究看看后分享上来。

关于TestStack.White

TestStack.White(之后都简称为White)是一款将Windows本身具有的UI自动化测试框架“UIAutomation”包装后的套件,让Windows UI的测试程序撰写上更加方便的一个套件,接下来就来简单介绍一下White的使用方法

要被测试的程序

首先我先建立了一个加法器的项目,并将程序输出路径设为C:temp,程序名称为AddCalculator.exe,在之后的测试项目中,我们会在测试程序中自动打开这只加法器程序,输入数字并按下计算按钮,然后验证产生的结果是否正确。

加法器画面

"相加"按钮的程序

        private void btnAdd_Click(object sender, EventArgs e)
        {
            var result = Convert.ToInt32(txtNum1.Text) + Convert.ToInt32(txtNum2.Text);
            lblResult.Text = result.ToString();
        }

从程序画面与程序中可以看出测试项目中如果要验证结果正确,大概会有几个步骤

  1. 要先把程序执行起来
  2. 找到两个数字的控件组件,并输入要测试的数值
  3. 找到"相加"按钮,并让它触发Click事件
  4. 找到结果的label,检查内容是否正确

完成测试项目

有了基本的程序实践后,接下来我们就可以直接建立一个测试项目,并透过NuGet套件管理加入TestStack.White套件。

install-package TestStack.White

然后新增一个测试类,并加入以下程序

    [TestClass]
    public class CalculatorFormUITest
    {
        private Application application { get; set; }
        private Window window { get; set; }

        [TestInitialize]
        public void TestInitialize()
        {
            var applicationPath = "C:\temp\AddCalculator.exe";
            application = Application.Launch(applicationPath);
            window = application.GetWindow("加法器", InitializeOption.NoCache);
        }

        [TestCleanup]
        public void TestCleanup()
        {
            application.Close();
        }
    }

application与window的声明是用来存放开启的应用程序与窗口数据,这两个变量会在TestInitialize时取得,在TestInitialize中,首先会先使用Application.Launch()来开启我们的可执行文件,接着利用application.GetWindow()来取得我们要测试的窗口内容。application.GetWindow()的第一个参数是窗口的标题。

TestCleanup做的事情很简单,就是把窗口关掉而已。

TestInitialize与TestCleanup的内容可以让我们在每次测试开始时先把要测试的窗口打开,测试结束后将窗口关掉;接下来就新增一个测试方法,来模拟UI的操作与验证结果:

        [TestMethod]
        public void TestMedthod_Num1_Is_3_And_Num1_Is_5_Then_Result_Is_8()
        {
            // Arrange
            var txtNum1 = window.Get("txtNum1");
            txtNum1.Text = "3";

            var txtNum2 = window.Get("txtNum2");
            txtNum2.Text = "5";

            var expected = "8";

            // Act
            var button = window.Get("btnAdd");
            button.Click();

            // Assert
            var lblResult = window.Get("lblResult");
            var actual = lblResult.Text;

            Assert.AreEqual(expected, actual);
        }

再Arrange中,我们使用window.Get<控件类>("组件名称")来取得要被设定数值的组件及内容,之后在Act时透过一样使用window.Get方法取得要被按下去的按钮,只是Type改为Button以及正确的组件名称,最后再Assert则抓取显示结果的Lable,然后检查结果是否和预期相同。

之后再执行这个测试方法,就可以看到像下图的结果

测试程序会自动执行已经开发好的Windows Form,找到对应控件模拟行为,然后验证结果!

相关程序可以到这里下载: https://github.com/wellwind/WhiteUiTestingSamples/tree/master/Sample01

结语

本篇文章简单介绍了使用TestStack.White来对Windows From进行自动化测试的部分,透过直接寻找UI名称的方式找到对应的组件并自动操作组件的行为,然后测试行为发生后的结果是否正确。

利用一个简单的加法器程序来表示我们实际要测试的复杂UI,然后在测试项目中找到对应的控件,并针对实际操作的行为做模拟,最后检查操作结果的正确性。

White具有许多搜寻UI组件的功能,可以让我们在针对Windows Form做自动化测试时更加容易,关于这部分的细节之后再介绍。

除了White以外TestStack也有推出一些有用的测试套件,例如有再使用BDD开发系统的可以研究看看TestStack.BDDfy;针对ASP.NET MVC程序撰写测试程序时,也可以使用TestStack.FluentMVCTesting,让测试程序更加口语化。有兴趣的话可以到TestStack的GitHub上看看啰。

页面读取时增加进度条

[VB.NET]TextBox判断输入后是否有按Enter

猜你喜欢

转载自blog.csdn.net/mainmaster/article/details/109856674