转:微软UI自动化测试的技术演变(上)
上一篇 / 下一篇 2010-12-03 17:36:24 / 个人分类:自动化测试
&}{W9zUP0 微软UI自动化技术揭秘将分两个部分介绍Windows平台桌面程序的自动化技术。上篇将介绍从Win32 SDK至今的UI自动化技术演变,下篇将着重介绍最新的UI Automation(UIA)的内部实现和使用技巧。
m$\y-Q/S4d'Q0~|8Q.S;JU`0
2K0J3nUJ)w`0\ m[u@pp0w0 自动测试是指用一个程序自动地控制另外一个程序,模拟用户的操作进行测试。通常自动化测试涉及到下面三个步骤:51Testing软件测试网*@]8E{/]ML s
51Testing软件测试网CaBBT51Testing软件测试网X8Q!dUg/k*A
51Testing软件测试网z?^LK:\l测试源侦测51Testing软件测试网 LDmty:B6l
1Y~^,F?%P0}]c~0 测试源侦测是定位测试目标元素的过程。比如要测试Windows附件中的计算器,首先要把计算器窗口和其他程序比如写字板区分开。进一步测试计算器窗口菜单的时候,需要首先定位菜单条的位置,获取第二层子菜单等等。简单地说,自动化测试首先要能够获取从桌面开始的整个UI树结构,定位到特定测试目标。51Testing软件测试网 ]9l3z0kIq
51Testing软件测试网5E hs5`oj:LX0n.X6i?0UI+V2l0\] J2|+l0用户行为模拟
\3?u?!D1k"Fef0%u#]C xd3k0 用户行为模拟指模拟用户的输入,比如鼠标、键盘和触摸笔的操作,中间可能会涉及IME输入法、组合键、特定用户习惯,比如输入速度的模拟等。51Testing软件测试网?#Q2@:{#f&H F
51Testing软件测试网)A@W d^d?w*ee|^_aNl:D)_051Testing软件测试网 FT/A y:E,hr1D_测试目标检查51Testing软件测试网.h,e-{f ~z
51Testing软件测试网Acsw/P9Rq`:aZ1}指获取测试元素的属性,比如读取窗口标题, Listbox的子元素, Checkbox的状态等等,以便进行测试检查。51Testing软件测试网2v6@*X F l_7u"v zb4V3y
51Testing软件测试网M^{rQ3o/{ZA \?vr!F0Win32 SDK和Windows Message
51Testing软件测试网7OVM?/?O$a在.NET问世以前,Windows平台上的UI程序无外乎两种技术:Win32 Windows SDK 或者DirectX。由于DirectX多用于专业领域如游戏和CAD,本文并不讨论。51Testing软件测试网7P~X`~
51Testing软件测试网!?'C/UX{f&d无论是MFC,VCL还是VB6,Win32 SDK都是其根本,最终打交道的其实都是HWND和Windows Message。实现上述自动化的三个步骤 无外乎三件法宝,Win32 API,Windows Message和Windows Hook。
:I?hk1L]%co051Testing软件测试网#E9^?0aq测试程序首先通过 FindWindowEx和EnumWindow遍历窗口和子窗口, 找到测试元素比如某个按钮,然后可以通过Windows Message或者API检查测试目标。比如通过WM_GETTEXT或者GetWindowText读取窗口标题,通过GetWindowRect读取按钮坐标位置等等。对于用户行为模拟,可以直接通过SendKey API来完成,当然也可以发送WM_CHAR或者WM_KEYDOWN通知等等。51Testing软件测试网QK)b7tGz6a
2z'W3HW5Wa,|*|0 除此以外,Windows Hook更加丰富了技术的选取。通过Windows Hook,测试人员还可以直接监控、 截取、模拟目标程序的Windows消息,实现更灵活的模拟,检查甚至录制的功能。
p|!eDDLm051Testing软件测试网o9?n AtxWindows Spy++(图一)虽然不是测试工具,也算是使用这套技术的典型例子。通过Windows Spy++可以定位任意窗口, 读取窗口属性,监视窗口消息等等。51Testing软件测试网4D`*IY*M9ubL w
51Testing软件测试网{q'_ w5V3j3k;r-G
图一: Microsoft Spy++
(JRGh"M {051Testing软件测试网qu Px6xL$gDi-H采用Win32 SDK和Windows Message的优点是直接,灵活。由于直接使用Win32 API,没有额外的学习曲线,遇上问题可以直接参考Win32 SDK解决。使用Message Hook使得测试程序可以灵活实现,直接对Window Message的操作不仅可以把很多情况化繁为简,还方便test hook的实现。(所谓test hook,是指产品中为了方便测试而专门设计的隐藏功能,该功能对普通用户不可见,只是为了方便测试。)
7F4i|$Bh$w:F Z051Testing软件测试网J!@ ItfAto-@缺点包括以下三个方面:51Testing软件测试网/B7J)_C#P1a` l
51Testing软件测试网j"^7C%i^F$rE使用复杂,实现成本高。Win32 AP的使用上有很多需要特别注意的细节, 比如有的Win32 API不能跨进程工作,有的Windows Message只能发给当前线程所创建的窗口,稍有不慎,就导致测试程序不稳定。51Testing软件测试网9W*f*y{8?
^+w+B)f(g1{:g4\:k#a0 过于底层,不便使用。为了方便测试用例调用,需要对API进行封装,增加了实现成本。同时 Win32 API的也使得很多VB程序员不便调用。再者, 不同的开发工具,比如MFC, VCL,以及后来的.NET Framework,在内部实现上对Win32 API有很多细节的处理, 要实现出针对各种情况都通用的测试框架,并非易事。比如, .NET 中的WinForm. Control对Win32 HWND的维护是动态的,同一个WinForm. Control的HWND在程序的生命周期内是可能发生改变的,这一点对于依赖HWND作为唯一标识的Win32 API就是一个致命伤。51Testing软件测试网q+V:ZoR)r
51Testing软件测试网N&`f"eD*r-^;@无法操作自绘窗口。比如打开Excel的工作表,会发现表格中的每一个Cell并没有对应到HWND上。Excel的cell都是通过代码绘制,而不是依赖于现成的Win32 Control。这就使得Win32 API对于自绘窗口没有用武之地。51Testing软件测试网1w+u#]Ef2f
51Testing软件测试网5UP-Ww,K'Aj r+v5E9NBBM$P0MSAA
MSAA的全称是Microsoft Active Accessibility。这是类似DCOM技术。技术模型是这样的,UI程序可以暴露出一个Interface,方便另一个程序对其进行控制。MSAA技术的初衷是为了方便残疾人使用Windows 程序。比如盲人看不到窗口,但是盲人可以通过一个USB读屏器连接到电脑上, 读屏器通过UI程序暴露出来的这个Interface,就可以获取程序信息,通过盲文或者其它形式传递给盲人。51Testing软件测试网1hFr6s h0x,P*O y
MSAA提供了如此方便的功能, UI自动化测试自然可以借用这项技术。MSAA暴露出来的Interface叫做IAccessible。测试程序和目标UI程序互操作流程如下:51Testing软件测试网A"a(WcE&Bd
51Testing软件测试网*mD8} U)f1. 测试程序调用Windows API: AccessibleObjectFromWindow,传入目标UI程序HWND。51Testing软件测试网zjeo$[%n A
51Testing软件测试网1?@m*KG2XR ?%o2. AccessibleObjectFromWindow函数向UI程序发送WM_GETOBJECT消息。51Testing软件测试网F_v&u|4?b@
3. UI程序创建实现了IAccessible的内部类,然后通过LresultFromObject API把IAccessible 接口返回给测试程序。51Testing软件测试网0a GD~,H%^Iq4b
3g;pu\7tDS0 4. 测试程序拿到IAccessible接口,开始调用IAccessible接口函数操作测试目标。51Testing软件测试网 uAy\ vA!KL6C
51Testing软件测试网6q H3wYtQ[MIAccessible接口里面的几个关键函数是:
r?s;Gm V7n0- IAccessible::get_accChild/ IAccessible::get_accParent通过这两个函数,调用者可以浏览目标程序的窗口关系树,定位到UI元素。
- IAccessible::accLocation/I Accessible::accHitTest读取和分辨目标元素的屏幕位置。
- IAccessible::accName/ I Accessible:: accSelect读取元素的名字,对UI元素进行指定的操作,比如选取Listbox里面的某一项等等。
- IAccessible::accValue 开发人员可以自定义value属性的实现。比如针对折线图控件,开发人员可以在accValue中返回折线的坐标数列。
MSAA的理念 类似于test hook。 通过主动让UI程序暴露一个接口来让调用者控制。 在具体使用中,测试人员往往是结合MSAA和Win32 API操作,取长补短。一方面对于UI元素丰富的属性,比如style,钩选状态,是否最大化和模拟用户输入等,继续采用Win32 API。 另一方面用MSAA的优势来弥补Win32 API的一些不足,比如:51Testing软件测试网:o7t2K;dv
51Testing软件测试网hZG%X ~I由于MSAA有自己的get_accChild方法,使其控件树关系并不一定要和Win32 HWNDd关系对应一致。对于自绘窗口,虽然说只有一个HWND, 但是开发人员可以通过实现IAccessible接口来实现逻辑上的层次关系。比如Excel中就可以通过IAccessible把多个cell的子IAccessible接口暴露给调用者。
T&A)ai1E\cGx8I0