参考//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();}
从程序画面与程序中可以看出测试项目中如果要验证结果正确,大概会有几个步骤
要先把程序执行起来找到两个数字的控件组件,并输入要测试的数值找到"相加"按钮,并让它触发Click事件找到结果的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(){// Arrangevar txtNum1 = window.Get("txtNum1");txtNum1.Text = "3";var txtNum2 = window.Get("txtNum2");txtNum2.Text = "5";var expected = "8";// Actvar button = window.Get
("btnAdd");button.Click();// Assertvar lblResult = window.Get("lblResult");var actual = lblResult.Text;Assert.AreEqual(expected, actual);}
再Arrange中,我们使用window.Get<控件类>("组件名称")来取得要被设定数值的组件及内容,之后在Act时透过一样使用window.Get方法取得要被按下去的按钮,只是Type改为Button以及正确的组件名称,最后再Assert则抓取显示结果的Lable,然后检查结果是否和预期相同。
之后再执行这个测试方法,就可以看到像下图的结果
测试程序会自动执行已经开发好的Windows Form,找到对应控件模拟行为,然后验证结果!
相关程序可以到这里下载: /wellwind/WhiteUiTestingSamples/tree/master/Sample01
结语
本篇文章简单介绍了使用TestStack.White来对Windows From进行自动化测试的部分,透过直接寻找UI名称的方式找到对应的组件并自动操作组件的行为,然后测试行为发生后的结果是否正确。
利用一个简单的加法器程序来表示我们实际要测试的复杂UI,然后在测试项目中找到对应的控件,并针对实际操作的行为做模拟,最后检查操作结果的正确性。
White具有许多搜寻UI组件的功能,可以让我们在针对Windows Form做自动化测试时更加容易,关于这部分的细节之后再介绍。
除了White以外TestStack也有推出一些有用的测试套件,例如有再使用BDD开发系统的可以研究看看TestStack.BDDfy;针对 MVC程序撰写测试程序时,也可以使用TestStack.FluentMVCTesting,让测试程序更加口语化。有兴趣的话可以到TestStack的GitHub上看看啰。
页面读取时增加进度条
[]TextBox判断输入后是否有按Enter