TestCompleteDDT(Data-drivenTesting)数据驱动测试介绍和简单实例
原著者:Terry Young软件测试专业网站:51Testing软件测试网.c!R;{7i ~Alz Y!`
适合程度: 进阶
读完此文章之后,读者应该可以:
1. 认识DDT(Data-driven Testing) 是什么、它的用途和原理软件测试专业网站:51Testing软件测试网0c;jW3X@;@H
2. 按本文内的实例去练习和观察DDT的运行和原理
/O e7P{0Ij:j1495383. 笔者的一些发现 (DDT和亚洲文字的兼容)
DDT是什么?
一般的自动化测试脚本回放,都是模拟使用者的动作,包括鼠标和键盘。
然而,你可能会有需要对相同的控件上作更大或者更多元化的测试覆盖范围。
DDT(Data-drive Testing) 顾名思议就是数据驱动测试,概念就是基于同一个测试回放动作下由外部来源注入不同数据的测试。而在 TestComplete 里面 DDT 实际上是内置的一个类 (Class) 包含特定的属性 (Properties) 和函数 (Methods),是要测试员在代码内编写来实现的。
假设,你录制了一个日期控件上面输入 28/02/2008 的过程,回放时当然没有问题了。不过,如果输入其他无效值的话 (例如 31/02/2008) 就能测试出对像的容错能力。此时,你可以考虑将数据 (日期) 和动作逻辑 (日期控件上的操作) 分开,将代码演变成数据驱动测试。
实现DDT的基本步骤就是将你录制后所生成的、硬写的 (hard-coded) 的值,修改为 DDT 的逻辑。
所谓DDT的逻辑,基本上是以一个回圈 (Loop) 来进行如下的几步:
1. 建立数据驱动,并读入数据软件测试专业网站:51Testing软件测试网5Y:O%|+^.@x{'?8Lp
2. 结合所读入的数据和所录制的动作软件测试专业网站:51Testing软件测试网3~)z \GeIRV
3. 验证结果软件测试专业网站:51Testing软件测试网'V8di^i
4. 继续下一个数据纪录 (回圈,直至最后一个纪录为止)
8sr } zV0?1495385. 关闭数据驱动,DDT.CloseDriver(Driver.Name)
DDT可用的数据来源
TestComplete 的DDT可以利用不同的数据来源,有三种:
1. ADO database软件测试专业网站:51Testing软件测试网/`c5w)w6o5W Km
2. Excel sheet
rC$c7E B*D,`3H1495383. CSV (逗号分隔文件)
DDT 实例
如果你仍然觉得 DDT 好像很抽像似的,以下是一个很简单的实例,只要按以下步骤准备的话,你在 TestComplete 内回放并且观察之后,希望能令一些比较迷茫的读者终于开窍吧。
这个实例,将会以 Notepad (记事本) 作为测试对像,以一个Excel 档案作为数据来源,利用 DDT 进行数据驱动测试,将 Excel 的每行资料输入在 Notepad 内,每栏以 Tab 作分隔。
先建立一个 Excel,可以将以下的表进行剪贴,将 Excel 保存成 SampleData.xls。
Field1 | Field2 | 栏位三 | 金额(边界测试) |
Val A1 | Val B1 | 值C1 | 0 |
Val A2 | Val B2 | 值C2 | 1 |
Val A3 | Val B3 | 值C3 | -1 |
Val A4 | Val B4 | 值C4 | 10000000 |
Val A5 | Val B5 | 值C5 | -10000000 |
最好先开一个新的 Project / Project Suite。
如你的 Project 内未有 TestedApps,右按 Project > Add > New Item,选择 Win32 Tested Applications。
在你的 TestedApps 加入 C:\Windows\notepad.exe 这个测试对像,并保存 TestedApps。
在你的 Project > scrīpt 内建立单元,将以下代码剪贴,修改一下含有 SampleData.xls 这行代码,指向实际档案的绝对路径,然后保存和运行 TestDriver 这个函数。
' (Main routine)
.g c_(L-kYWe{149538Sub TestDriver
2~4{4b3g*r4U:tS149538 ' 运行 Notepad
F"tBTZ149538 TestedApps.RunAll 软件测试专业网站:51Testing软件测试网_!S!_q7Z
' 建立数据驱动
)hF Z`p149538 Dim Driver软件测试专业网站:51Testing软件测试网{\pN({ b
Set Driver = DDT.ExcelDriver("Files/SampleData.xls", "Sheet1")
' 在 notepad 内输入资料栏
R#E5gyu1F149538 For i = 0 To DDT.CurrentDriver.ColumnCount - 1
;e K#` dMvCL149538 Call Appendtext(DDT.CurrentDriver.ColumnName(i))
}Z%vtR'bl149538 If i < DDT.CurrentDriver.ColumnCount - 1 Then
ES[ovdu149538 Call AppendText(vbTab)' Tab 分隔
;\4gd-UH W-q)IPq149538 End If
L [8^)Jx1e/B149538 Next
%^!mg5O(auF149538 Call AppendText(vbNewLine)
' 回圈处理每列纪录软件测试专业网站:51Testing软件测试网a(S$PF J?+e
While Not Driver.EOF
o|,pMG2DSV+X149538 Call ProcessData()' 处理纪录软件测试专业网站:51Testing软件测试网N1p2Jw2[&i}
Call AppendText(vbNewLine)软件测试专业网站:51Testing软件测试网bd'o-mA;C4` X
Call Driver.Next()' 移到下一列纪录
j6s!edR2a d149538 WEnd
' 关闭驱动软件测试专业网站:51Testing软件测试网-o5H+vJl ~!hi
Call DDT.CloseDriver(Driver.Name)
\i D1M)@fTK149538End Sub
' 处理一列纪录软件测试专业网站:51Testing软件测试网2W9@h?(YXs a { @1c
Sub ProcessData软件测试专业网站:51Testing软件测试网 IcMu#Xr5g
Dim i
8jy*k#y3Kl_ S149538 ' 处理一列内每栏的资料
6T)J"V g$w/EW XS149538 For i = 0 To DDT.CurrentDriver.ColumnCount - 1软件测试专业网站:51Testing软件测试网 Ko c{W'd
Call Appendtext(DDT.CurrentDriver.Value(i))
SDXk9fa(h149538 If i < DDT.CurrentDriver.ColumnCount - 1 Then
Z*_l1j:Ix ?r149538 Call Appendtext(vbTab)' Tab 分隔软件测试专业网站:51Testing软件测试网~s cbT8G/m
End If
5z.vR2qO-h4OG149538 Next
pv)OE WD `149538End Sub
' 辅助函数,会在 notepad 字串结尾加插参数所提供的值软件测试专业网站:51Testing软件测试网%C2aBQ"J&o ~-jG
Sub AppendText (str)
y`,jQ$HIB"i149538 Dim p1
`+m,S E4XY-T.C149538 Set p1 = Sys.Process("notepad").Window("Notepad").Window("Edit", "", 1)
' 备注:用 p1.Keys(...) 似乎有个弊处,就是不能模拟中文字的输入,
w V i.I3{ kj$E149538 ' 除非 p1.Keys(...) 里面的值是硬写去的 (hard-coded) 软件测试专业网站:51Testing软件测试网]*H\W!j7];V
p1.wText = p1.wText & str' 所以唯有利用 wText 属性,赋以资料软件测试专业网站:51Testing软件测试网Zx+Q;W b.C6V]
End Sub
希望读者可以透过此实例的运行,观察一下 DDT 的制作和原理。更深层次的代码编写参考资料,还是参考 TestComplete 帮助文件比较好。
笔者的一些发现 (DDT和亚洲文字的兼容)
以下只是笔者的观察和推论,并未真正去证实过的。欢迎留言纠正。
或者读者也会留意到我这例子,基本的逻辑很像 TestComplete 的帮助文件里面的例子一样;我只是将测试对像转为用 Notepad 而已,因为实际上我们多数是要利用数据在测试对像的介面上模拟输入的动作。
很遗憾的是,如果用 Keys( 数据值 ) 这样的做法的话,运行时只是能够键入英数,而中文字的输入好像模拟不到。
所以,实例中代码内AppendText 这个函数里面,我没有用 p1.Keys(…),而是直接改变 notepad 的 edit 控件内 wText 这个属性。严格来说,这不是模拟键盘的动作的,所以,如果你的对像控件会因键盘事件而触发一些功能的话,这个直接改变属性的做法可能会触发不到的。
- 完 -