使用TestStack.White进行Windows UI的自动化测试
https://github.com/TestStack/White/tree/0.13.2
本文章将简单介绍 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()
{
// 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,让测试程序更加口语化