一种GUI自动化测试框架方案
扫描二维码
随时随地手机看文章
目前,在GUI自动化测试中,很多软件体系都采用录制回放技术。这种技术要求测试者通过鼠标和键盘的点击进行工作,脚本记录事件,然后以自动化测试的方式进行回放。记录下来的测试脚本必须经过编辑和调试之后插入验证和检查点。产生的脚本通常是硬编码,需要测试人员对脚本进行编辑以及参数化操作。同时,界面元素属性的任何变化都会影响脚本的运行,有时甚至需要重新录制脚本。
1 .NET中的反射机制
通常,应用程序(包括桌面程序和Web应用)都由一些基本的界面控件组成,所有的软件指令都是通过控件以事件或消息的形式传递给后台处理。GUI自动化测试的本质是对GUI中的控件元素提供编程手段[2]。在基于GUI对象识别和控制的自动化测试工具中,过去一直依赖于Windows API函数的调用。而随着新的编程语言和平台的出现,涌现了很多新的语言特性,这些语言特性可用于自动化测试工具的设计,例如反射机制就是其中一项技术。
反射(Reflection)是.NET中的重要机制,通过反射可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件及构造函数等,还可以获得每个成员的名称、限定符和参数等。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性[3]。
2 框架的整体设计
自动化测试框架的搭建基本上占了整个自动化测试工作量的40%,是自动化测试实施的一个重要组成部分。软件自动化框架从本质看是一系列的策略思想、规范文件和代码的集合。本文提出一种改进的轻量级的GUI自动化测试框架,该框架可以帮助用户避免当前测试工具出现的缺陷。此框架将具备以下五个特性:GUI控件自动搜索、自动生成和执行测试脚本、基于数据驱动的原则、测试的自动验证、使用编程语言开发。框架的整体设计如图1所示。从图1可以看出,该框架让测试人员从繁重的录制工作中解放出来,将更多的时间和精力集中在测试用例的设计中。
3 框架具体开发
3.1 加载被测试程序
为了测试GUI应用程序,必须在测试工具中运行被测程序使两个程序交互。使用Assembly定义和加载程序集,加载在程序集清单中列出模块,并从此程序集中查找类型,创建该类型的实例。为了使这两个应用程序实现交互,必须通过多线程机制实现。下面是通过反射加载被测程序的核心代码[4]:
Assembly asm=Assembly.LoadFrom(path);
Type t1=asm.GetType(formName);
testForm=(Form)asmCreateInstance(t1.FullName);
ParameterizedThreadStart pt=new ParameterizedThreadStart(AppRun);
Thread thread=new Thread(pt);
thread.Start(testForm);
private void AppRun(Form theForm)
{
Application.Run(theForm);
}
3.2 GUI控件搜索
大部分自动化功能测试工具,尤其是商业的测试工具,都是基于GUI对象识别技术设计的。基本思想是每个基于窗体的控件都是一个窗体,每个控件或窗体都有一个句柄来进行访问、操作和检查。
实现GUI测试自动化的困难之一是测试工具并不知道被测程序中存在哪些GUI部件。录制回放工具使用手工录制过程暂时解决了这一问题。Win32 API中封装了很多可用于自动化测试编程的函数,这些函数可在编程语言进行调用,实现自动化测试编程。本文的自动化GUI测试工具将采用Win32 API对被测程序进行自动、系统、全面的控件搜索。实现该搜索将用到Win32 API中封装的可用于自动化测试编程的函数,包括:GetWindowRect、mouse_event、GetCursorPos和WindowFromPoint函数等。GetWindowRect函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。通过使用这个函数可以计算出窗口的宽度和高度。mouse_event函数能模拟鼠标击键和鼠标动作。GetCursorPos函