VS2010测试功能之旅
——编码的UI测试系列之五:常用测试要点和函数:使用数据驱动的测试
RealZhao,2011年3月31日
回顾
在上一章介绍了如何通过自定义编码的方式来实现自动化测试,通过先设计用例,然后将其转换为代码的方式写在了UIMap1.designer.cs,我们可以发现,在测试的过程中,测试的数据都是不变的,想换一组测试数据就会相当困难,必须得一处一处改代码,而且只支持这一条数据,如何解决这个问题呢?这就是本章介绍的重点。
数据驱动的测试
为了解决方面所说的“必须得一处一处该代码,而且还只支持一条数据”的困难,提高测试脚本的复用性,这里引入了数据驱动测试的概念。
数据驱动测试 (Data-drive Testing)是一种在单个测试脚本使用不同的输入和响应数据重复地执行测试的技术,这些数据来源于一个预定义的数据集。
我们也可以这么简单理解,DDT就是在同一个测试回放动作下由外部来源注入不同数据的测试。
其核心是将数据与测试脚本分离,从而可以在不修改测试脚本的情况下通过更新测试数据完成对测试用例的增加、更改和删除。
从设计开始
为方便起见,我们先以第一章(一个简单的示例)中提到的这个程序为例:
(点此下载这个示例程序,里面的RightDemo.exe是我们现在要用到的)
在第一章中我们分别录制了
InputErrorUidPwd()[输入错误的用户名和密码,点击登陆]
AssertErrorWinow()[断言“用户名密码错误”弹出框弹出]
InputRightUidPwd()[输入正确的用户名和密码,点击登陆]
AssertRightWinow()[断言“登陆成功”弹出框弹出]
这样几个操作,如果我们仔细观察,在整个测试中,一共输入了以下4类数据:
第一类:错误的用户名
第二类:错误的密码
第三类:正确的用户名
第四类:正确的密码
如果将这4类数据给独立出来,用ErrorUid,ErrorPwd,RightUid,RightPwd表示,放在专门的文件当中(例如Excel),每一行代表一组测试数据,例如如下所示:
ErrorUid | ErrorPwd | RightUid | RightPwd |
Userxx | 111111 | Admin | 123456 |
UserWithOutPwd |
| Admin | 123456 |
…… | …… | …… | …… |
OtherErrorUid | OtherErrorPwd | OtherRightUid | OtherRightPwd |
之后修改VS2010,让其从这个Excel文件中读取测试数据,一行行地遍历,然后填入被测试的程序,这样就可以执行很多种不同组合,不同情况的数据,使测试面积覆盖更加广泛。
理解这个,就已经理解DDT了,接下来仅仅是实现问题了
使用VS2010UI测试实现DDT
我们不妨先设置这两行
ErrorUid | ErrorPwd | RightUid | RightPwd |
Userxx | 111111 | Admin | 123456 |
UserWithOutPwd |
| Admin | 123456 |
然后将其保存为.CSV格式的文件,命名为CodeUItestDemo.csv(这个在Excel中可以设置为保存为.CSV,如不明白请Google)
之后我们还是得按照第一章(一个简单的示例)中介绍的方式来录制实这4个方法
InputErrorUidPwd()[输入错误的用户名和密码]
AssertErrorWinow()[断言“用户名密码错误”弹出框弹出]
InputRightUidPwd()[输入正确的用户名和密码]
AssertRightWinow()[断言“登陆成功”弹出框弹出]
录制后在CodedUITest1.cs文件下生成的调用代码如下:
2 public void CodedUITestMethod1()
3 {
4 this .UIMap.InputErrorUidPwd();
5 this .UIMap.AssertErrorWinow();
6 this .UIMap.InputRightUidPwd();
7 this .UIMap.AssertRightWinow();
8 }
录制后在UIMap1.Designer.cs文件下生成的操作代码如下(注,需要在AssertRightWinow()添加两句代码,关闭那个“登陆成功”弹出框,不然没法循环跑,添加的代码我已经用黄色背景标出)
2 {
3 WinEdit uITbx_uidEdit = this .UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
4 WinEdit uITbx_pwdEdit = this .UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
5 WinButton uI登录Button = this .UI系统登录Window.UI登录Window.UI登录Button;
6
7 uITbx_uidEdit.Text = this .InputErrorUidPwdParams.UITbx_uidEditText;
8 uITbx_pwdEdit.Text = this .InputErrorUidPwdParams.UITbx_pwdEditText;
9 Mouse.Click(uI登录Button, new Point( 64 , 19 ));
10 }
11
12 public void AssertErrorWinow()
13 {
14 WinText uI用户名或密码错误Text = this .UI提示Window.UI用户名或密码错误Window.UI用户名或密码错误Text;
15
16 Assert.AreEqual( this .AssertErrorWinowExpectedValues.UI用户名或密码错误TextExists, uI用户名或密码错误Text.Exists);
17 }
18
19 public void InputRightUidPwd()
20 {
21 WinButton uIOKButton = this .UI提示Window.UIOKWindow.UIOKButton;
22 WinEdit uITbx_uidEdit = this .UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
23 WinEdit uITbx_pwdEdit = this .UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
24 WinButton uI登录Button = this .UI系统登录Window.UI登录Window.UI登录Button;
25
26 Mouse.Click(uIOKButton, new Point( 30 , 14 ));
27 uITbx_uidEdit.Text = this .InputRightUidPwdParams.UITbx_uidEditText;
28 uITbx_pwdEdit.Text = this .InputRightUidPwdParams.UITbx_pwdEditText;
29 Mouse.Click(uI登录Button, new Point( 63 , 11 ));
30 }
31
33 public void AssertRightWinow()
34 {
35 WinText uI登陆成功Text = this .UI提示Window.UI用户名或密码错误Window.UI登陆成功Text;
36 WinButton uIOKButton = this .UI提示Window.UIOKWindow.UIOKButton;
37
38 Assert.AreEqual( this .AssertRightWinowExpectedValues.UI登陆成功TextExists, uI登陆成功Text.Exists);
39 Mouse.Click(uIOKButton, new Point(30, 14 ));
40 }
然后在菜单中选择测试视图
之后就可以看到测试视图了,在测试视图中选择测试,然后右键点击,选择“属性”
切到详细的属性页面,如下图所示:
在这些属性中,值得注意的一共有两个
第一个是DataAccessMethod,数据访问方法,用于控制在读取数据的时候,是随机取行,还是顺序取行,默认是Sequential,顺序取行
第二个是DataConnectionString,数据连接字符串,用于设置数据源来源(也就是Excel文件是什么位置)
现在对DataConnectionString进行设置,选中它,点击右边的[…],就会弹出这个数据设置向导,选择”CSV File”,点击下一步
导入我们之前的CodedUITestDemo.CSV文件,可以看到数据已经加载出来了
点击Finish,设置结束,可以看到CodedUITest1.cs文件中的调用方法自动生成了属性标签:
2 public void CodedUITestMethod1()
3 {
4 this .UIMap.InputErrorUidPwd();
5 this .UIMap.AssertErrorWinow();
6 this .UIMap.InputRightUidPwd();
7 this .UIMap.AssertRightWinow();
8 }
OK,现在已经设置好了,不过别急,还没完呢,首先我们来仔细看看录制所生成操作代码UIMap1.designer.cs:
2 {
3 WinEdit uITbx_uidEdit = this .UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
4 WinEdit uITbx_pwdEdit = this .UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
5 WinButton uI登录Button = this .UI系统登录Window.UI登录Window.UI登录Button;
6
7 uITbx_uidEdit.Text = this .InputErrorUidPwdParams.UITbx_uidEditText;
8 uITbx_pwdEdit.Text = this .InputErrorUidPwdParams.UITbx_pwdEditText;
9 Mouse.Click(uI登录Button, new Point( 64 , 19 ));
10 }
11
12 public void AssertErrorWinow()
13 {
14 WinText uI用户名或密码错误Text = this .UI提示Window.UI用户名或密码错误Window.UI用户名或密码错误Text;
15
16 Assert.AreEqual( this .AssertErrorWinowExpectedValues.UI用户名或密码错误TextExists, uI用户名或密码错误Text.Exists);
17 }
18
19 public void InputRightUidPwd()
20 {
21 WinButton uIOKButton = this .UI提示Window.UIOKWindow.UIOKButton;
22 WinEdit uITbx_uidEdit = this .UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
23 WinEdit uITbx_pwdEdit = this .UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
24 WinButton uI登录Button = this .UI系统登录Window.UI登录Window.UI登录Button;
25
26 Mouse.Click(uIOKButton, new Point( 30 , 14 ));
27 uITbx_uidEdit.Text = this .InputRightUidPwdParams.UITbx_uidEditText;
28 uITbx_pwdEdit.Text = this .InputRightUidPwdParams.UITbx_pwdEditText;
29 Mouse.Click(uI登录Button, new Point( 63 , 11 ));
30 }
31
32 public void AssertRightWinow()
33 {
34 WinText uI登陆成功Text = this .UI提示Window.UI用户名或密码错误Window.UI登陆成功Text;
35 WinButton uIOKButton = this .UI提示Window.UIOKWindow.UIOKButton;
36
37 Assert.AreEqual( this .AssertRightWinowExpectedValues.UI登陆成功TextExists, uI登陆成功Text.Exists);
38 Mouse.Click(uIOKButton, new Point( 30 , 14 ));
39 }
看到了吗?设置值的时候,是使用的参数,实际上,在VS2010UI测试中,只要是录制了设置值(填文本框或下拉框),或者比较值(断言)的操作,VS2010都会自动生成这些参数,自动生成的参数在UIMap1.designer.cs的位置如下:
明白这个原理后,要是想实现数据驱动的测试,还要在CodedUITest1.cs这里改一下调用代码,才能真正实现DDT,修改之后的代码如下:
2 public void CodedUITestMethod1()
3 {
4 this .UIMap.InputErrorUidPwdParams.UITbx_uidEditText = TestContext.DataRow[ " ErrorUid " ].ToString();
5 this .UIMap.InputErrorUidPwdParams.UITbx_pwdEditText = TestContext.DataRow[ " ErrorPwd " ].ToString();
6 this .UIMap.InputRightUidPwdParams.UITbx_uidEditText = TestContext.DataRow[ " RightUid " ].ToString();
7 this .UIMap.InputRightUidPwdParams.UITbx_pwdEditText = TestContext.DataRow[ " RightPwd " ].ToString();
8
9 this .UIMap.InputErrorUidPwd();
10 this .UIMap.AssertErrorWinow();
11 this .UIMap.InputRightUidPwd();
12 this .UIMap.AssertRightWinow();
13 }
之后打开示例用到的应用程序,点击运行来进行测试
可以看到,.CSV文件中有多少行数据,这里就会将被测试的程序运行几次.
示例代码下载:下载点我
总结
本章介绍了如何在VS2010UI测试中建立数据驱动的测试,不知道大家是否想要尝试尝试了,在第四章(上)和第四章(下)的时候,我曾介绍过一个稍微比较复杂的程序用来实现自定义编码,大家可以试着给他设计一个.CSV文件来实现数据驱动测试。明天这个时候我会公布我自己的设计和实现的源代码,大家可以进行对比。
提示:因为那个完全是自己写的,VS2010不会自动生成参数,这个时候需要我们自己在UIMap.cs文件建立个公共字段或者属性,然后在CodedUITest.cs文件给它们赋值。
附:发布计划
编码的UI测试系列之一:入门篇 一个简单的示例(Released)
编码的UI测试系列之二:入门篇 操作动作的录制原理(上)(Released)
编码的UI测试系列之二:入门篇 操作动作的录制原理(下)(Released)
编码的UI测试系列之三:入门篇 操作对象的识别原理 (Released)
编码的UI测试系列之四:进阶篇 通过编写测试代码的方式建立UI测试(上)(Released)
编码的UI测试系列之四:进阶篇 通过编写测试代码的方式建立UI测试(下)(Released)
编码的UI测试系列之五:进阶篇 常用测试要点和函数(1)(Released)
编码的UI测试系列之六:进阶篇 常用测试要点和函数(2)
编码的UI测试系列之七:进阶篇 UI测试之间的互相引用和测试组织
编码的UI测试系列之八:高级篇 远程调用其他机器进行测试
编码的UI测试系列之九:高级篇 使用MS测试管理器组织测试