用TestComplete实现一个关键字驱动测试框架
陈能技 2008-6-27
最近在做使用TestComplete做一个自动化测试项目的时候,发现在TestComplete中,可以利用其中的FindChild方法来实现一个简单的关键字驱动的框架,方法如下:
(1)在Excel编写测试关键字。
在Excel文件中编写测试关键字,包括测试对象、测试操作、输入的参数等,如图所示:
(2)编写测试脚本,读入Execl中的测试关键字。
// 全局的变量数组,用于存储从Excel读入的测试关键字
Var KeyWord_TestObject,KeyWord_Operation,KeyWord_Parameters;
//.............................................................................
// 目的:通过ADO查询Excel数据
// 输入参数:
//
ExcelFilePath :Excel文件的路径
//
QueryString:查询语句
// 返回结果:
//
返回所有关键字数据,赋值给KeyWord_TestObject,KeyWord_Operation,KeyWord_Parameters这3个全局的变量数组
// 注意事项:
// 作者:陈能技
// 日期:2008-6-3
//.............................................................................
Function ReadKeyWordFromExcel(ExcelFilePath,QueryString);
Var ConStr,Connection,RS,ClassObjArray,LineIndex,ClassObject:OleVariatn;
begin
// 定义连接串
ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%S;Extended Properties=Excel 8.0';
ConStr := Utilities.Format(ConStr,[ExcelFilePath]);
Connection := Sys.OleObject('ADODB.Connection');
// 打开连接
Connection.Open(ConStr);
// 执行查询操作
RS := Connection.Execute(QueryString);
// 创建变量数组
KeyWord_TestObject := CreateVariantArray(0,0);
KeyWord_Operation := CreateVariantArray(0,0);
KeyWord_Parameters := CreateVariantArray(0,0);
LineIndex := 0;
// 循环读入所有数据
While Not RS.EOF do
begin
Inc(LineIndex);
// 动态修改数组大小
VarArrayRedim(KeyWord_TestObject,LineIndex-1);
VarArrayRedim(KeyWord_Operation,LineIndex-1);
VarArrayRedim(KeyWord_Parameters,LineIndex-1);
// 赋值
KeyWord_TestObject[LineIndex-1] := RS['TestObject'].Value;
KeyWord_Operation[LineIndex-1] := RS['Operation'].Value;
KeyWord_Parameters[LineIndex-1] := RS['Parameters'].Value;
// 下一条数据
RS.MoveNext;
end;
RS.Close;
// 关闭连接
Connection.Close;
end;
Procedure Test_ReadKeyWordFromExcel;
Var I : OleVariant;
begin
ReadKeyWordFromExcel('D:/Code/MyTestSuite/Data/KeyWord.xls','Select * from [KeyWord$]');
For I := 0 to VarArrayHighBound(KeyWord_TestObject,1) do
begin
Log.Message(VarToStr(KeyWord_TestObject[I])+ ' | '
+ VarToStr(KeyWord_Operation[I])+' | '
+ VarToStr(KeyWord_Parameters[I]));
end;
end;
(3)封装一个函数,用于根据Excel读入的测试关键字创建可用的测试对象。
Uses CheckUIPerformance;
//.............................................................................
// 目的:返回当前进程中的指定测试对象
// 输入参数:
//
Process :进程对象
//
TestObject:测试对象的描述
// 返回结果:
//
返回当前进程中的指定测试对象
// 注意事项:
// 作者:陈能技
// 日期:2008-6-3
//.............................................................................
Function getObject(Process,TestObject);
var
PropArray, ValuesArray;
begin
PropArray := CreateVariantArray(0, 0);
ValuesArray := CreateVariantArray(0, 0);
PropArray[0] :='FullName';
ValuesArray[0] := TestObject;
// 调用 FindTestObject 函数,返回当前进程中的指定测试对象
Result := FindTestObject(Process,PropArray,ValuesArray);
end;
这里调用了CheckUIPerformance脚本中编写的FindTestObject函数,该函数用于根据测试对象的描述信息查找指定进程中的测试对象,脚本如下:
Function FindTestObject(Process,PropArray,ValueArray);
var res;
begin
Result := False;
// 查找指定的测试对象
Process.Refresh();
res := Process.FindChild(PropArray, ValueArray, 1000);
// 返回测试对象
if res.Exists then
begin
Result := res;
Log.Message('找到测试对象: ' + res.FullName)
end
else
Log.Message('未找到测试对象');
end;
(4)封装一个函数,用于根据Excel读入的测试关键字执行测试操作。
//.............................................................................
// 目的:执行测试操作
// 输入参数:
//
TestObject :测试对象
//
Operation:测试操作的描述
//
Parameters:测试操作对应的参数
// 返回结果:无
// 注意事项:
// 作者:陈能技
// 日期:2008-6-3
//.............................................................................
Function DoOperation(TestObject,Operation,Parameters);
begin
case Operation of
'Keys' : TestObject.Keys(Parameters);
'Click' : TestObject.Click;
// 添加其它类型的测试操作的处理代码 ...
else
Log.Error('不支持该测试操作!');
end;
end;
注:这里仅仅添加了 Keys 和 Click 的测试操作。
(5)关键字驱动的核心框架
有了前面几个函数的基础,就可以写出下面一个简单的关键字驱动的核心框架:
//.............................................................................
// 目的:关键字驱动的核心框架
// 输入参数:
// 返回结果:
// 注意事项:
// 作者:陈能技
// 日期:2008-6-3
//.............................................................................
Procedure Driver;
Var TestObject,I;
begin
// 1、读入关键字
ReadKeyWordFromExcel('D:/Code/MyTestSuite/Data/KeyWord.xls','Select * from [KeyWord$]');
// 2、遍历关键字,创建测试对象、执行测试操作
For I := 0 to VarArrayHighBound(KeyWord_TestObject,1) do
begin
//
Log.Message(VarToStr(KeyWord_TestObject[I])+ ' | '
//
+ VarToStr(KeyWord_Operation[I])+' | '
//
+ VarToStr(KeyWord_Parameters[I]));
// 创建测试对象
TestObject := getObject(Sys.Process('flight4a'),VarToStr(KeyWord_TestObject[I]));
// 执行测试操作
DoOperation(TestObject,VarToStr(KeyWord_Operation[I]),VarToStr(KeyWord_Parameters[I]));
end;
end;
经试验,这种方法是可以实现类似QTP的关键字驱动测试框架,但是仅仅是一个非常基础的关键字驱动测试框架,如果想把这个框架应用在实际项目中的话,还需要进一步地修改和完善,还有很多工作要做,包括:
(1)关键字编辑器的编写。
目前采用直接在Excel文件中填写测试关键字的方法,存在效率和可用性问题,需要创建一个类似QTP的更加好用的关键字视图编辑器。
(2)添加更多的测试操作和方法。
目前作为试验,仅仅添加了 Keys 和 Click 的测试操作,还有很多控件的很多测试方法需要封装,例如List控件的ClickItem、SelectItem等,另外,对测试对象的属性赋值操作、属性检查操作(类似于QTP的CheckPoint)等都需要进一步地编写框架代码来处理。
(3)关键字代码与测试脚本之间的同步。
仅仅依赖Excel的关键字数据来实现整个项目的自动化测试未免过于理想化了,QTP提供了很好的代码生成机制,关键字视图的数据与专家视图的测试脚本之间可以随时同步、切换,因此这个关键字驱动测试框架还缺少一个代码生成器,如何建立Excel数据与测试脚本之间的映射关系是下一步的主要工作之一。