数据驱动的测试
为了解决方面所说的“必须得一处一处该代码,而且还只支持一条数据”的困难,提高测试脚本的复用性,这里引入了数据驱动测试的概念。
数据驱动测试 (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文件下生成的调用代码如下:
1[TestMethod]
2publicvoidCodedUITestMethod1()
3{
4this.UIMap.InputErrorUidPwd();
5this.UIMap.AssertErrorWinow();
6this.UIMap.InputRightUidPwd();
7this.UIMap.AssertRightWinow();
8}
录制后在UIMap1.Designer.cs文件下生成的操作代码如下(注,需要在AssertRightWinow()添加两句代码,关闭那个“登陆成功”弹出框,不然没法循环跑,添加的代码我已经用黄色背景标出)
1publicvoidInputErrorUidPwd()
2{
3WinEdit uITbx_uidEdit=this.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
4WinEdit uITbx_pwdEdit=this.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
5WinButton uI登录Button=this.UI系统登录Window.UI登录Window.UI登录Button;
6
7uITbx_uidEdit.Text=this.InputErrorUidPwdParams.UITbx_uidEditText;
8uITbx_pwdEdit.Text=this.InputErrorUidPwdParams.UITbx_pwdEditText;
9Mouse.Click(uI登录Button,newPoint(64,19));
10}
11
12publicvoidAssertErrorWinow()
13{
14WinText uI用户名或密码错误Text=this.UI提示Window.UI用户名或密码错误Window.UI用户名或密码错误Text;
15
16Assert.AreEqual(this.AssertErrorWinowExpectedValues.UI用户名或密码错误TextExists, uI用户名或密码错误Text.Exists);
17}
18
19publicvoidInputRightUidPwd()
20{
21WinButton uIOKButton=this.UI提示Window.UIOKWindow.UIOKButton;
22WinEdit uITbx_uidEdit=this.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
23WinEdit uITbx_pwdEdit=this.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
24WinButton uI登录Button=this.UI系统登录Window.UI登录Window.UI登录Button;
25
26Mouse.Click(uIOKButton,newPoint(30,14));
27uITbx_uidEdit.Text=this.InputRightUidPwdParams.UITbx_uidEditText;
28uITbx_pwdEdit.Text=this.InputRightUidPwdParams.UITbx_pwdEditText;
29Mouse.Click(uI登录Button,newPoint(63,11));
30}
31
33publicvoidAssertRightWinow()
34{
35WinText uI登陆成功Text=this.UI提示Window.UI用户名或密码错误Window.UI登陆成功Text;
36WinButton uIOKButton=this.UI提示Window.UIOKWindow.UIOKButton;
37
38Assert.AreEqual(this.AssertRightWinowExpectedValues.UI登陆成功TextExists, uI登陆成功Text.Exists);
39Mouse.Click(uIOKButton,newPoint(30,14));
40}
然后在菜单中选择测试视图
之后就可以看到测试视图了,在测试视图中选择测试,然后右键点击,选择“属性”
切到详细的属性页面,如下图所示:
在这些属性中,值得注意的一共有两个
第一个是DataAccessMethod,数据访问方法,用于控制在读取数据的时候,是随机取行,还是顺序取行,默认是Sequential,顺序取行
第二个是DataConnectionString,数据连接字符串,用于设置数据源来源(也就是Excel文件是什么位置)
现在对DataConnectionString进行设置,选中它,点击右边的[…],就会弹出这个数据设置向导,选择”CSV File”,点击下一步
导入我们之前的CodedUITestDemo.CSV文件,可以看到数据已经加载出来了
点击Finish,设置结束,可以看到CodedUITest1.cs文件中的调用方法自动生成了属性标签:
1[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV","|DataDirectory|\\CodeUItestDemo.csv","CodeUItestDemo#csv", DataAccessMethod.Sequential), DeploymentItem("CodeUItestDemo.csv"), TestMethod]
2publicvoidCodedUITestMethod1()
3{
4this.UIMap.InputErrorUidPwd();
5this.UIMap.AssertErrorWinow();
6this.UIMap.InputRightUidPwd();
7this.UIMap.AssertRightWinow();
8}
OK,现在已经设置好了,不过别急,还没完呢,首先我们来仔细看看录制所生成操作代码UIMap1.designer.cs:
1publicvoidInputErrorUidPwd()
2{
3WinEdit uITbx_uidEdit=this.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
4WinEdit uITbx_pwdEdit=this.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
5WinButton uI登录Button=this.UI系统登录Window.UI登录Window.UI登录Button;
6
7uITbx_uidEdit.Text=this.InputErrorUidPwdParams.UITbx_uidEditText;
8uITbx_pwdEdit.Text=this.InputErrorUidPwdParams.UITbx_pwdEditText;
9Mouse.Click(uI登录Button,newPoint(64,19));
10}
11
12publicvoidAssertErrorWinow()
13{
14WinText uI用户名或密码错误Text=this.UI提示Window.UI用户名或密码错误Window.UI用户名或密码错误Text;
15
16Assert.AreEqual(this.AssertErrorWinowExpectedValues.UI用户名或密码错误TextExists, uI用户名或密码错误Text.Exists);
17}
18
19publicvoidInputRightUidPwd()
20{
21WinButton uIOKButton=this.UI提示Window.UIOKWindow.UIOKButton;
22WinEdit uITbx_uidEdit=this.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
23WinEdit uITbx_pwdEdit=this.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
24WinButton uI登录Button=this.UI系统登录Window.UI登录Window.UI登录Button;
25
26Mouse.Click(uIOKButton,newPoint(30,14));
27uITbx_uidEdit.Text=this.InputRightUidPwdParams.UITbx_uidEditText;
28uITbx_pwdEdit.Text=this.InputRightUidPwdParams.UITbx_pwdEditText;
29Mouse.Click(uI登录Button,newPoint(63,11));
30}
31
32publicvoidAssertRightWinow()
33{
34WinText uI登陆成功Text=this.UI提示Window.UI用户名或密码错误Window.UI登陆成功Text;
35WinButton uIOKButton=this.UI提示Window.UIOKWindow.UIOKButton;
36
37Assert.AreEqual(this.AssertRightWinowExpectedValues.UI登陆成功TextExists, uI登陆成功Text.Exists);
38Mouse.Click(uIOKButton,newPoint(30,14));
39}
看到了吗?设置值的时候,是使用的参数,实际上,在VS2010UI测试中,只要是录制了设置值(填文本框或下拉框),或者比较值(断言)的操作,VS2010都会自动生成这些参数,自动生成的参数在UIMap1.designer.cs的位置如下:
明白这个原理后,要是想实现数据驱动的测试,还要在CodedUITest1.cs这里改一下调用代码,才能真正实现DDT,修改之后的代码如下:
1[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV","|DataDirectory|\\CodeUItestDemo.csv","CodeUItestDemo#csv", DataAccessMethod.Sequential), DeploymentItem("CodeUItestDemo.csv"), TestMethod]
2publicvoidCodedUITestMethod1()
3{
4this.UIMap.InputErrorUidPwdParams.UITbx_uidEditText=TestContext.DataRow["ErrorUid"].ToString();