QT4C 是什么
QTA 作为腾讯内部元老级的自动化测试项目,之前已经先后对 QTAF、QT4A、QT4i、QT4W 进行了开源。在 QTA 正式对外开源提供了 Android 端、iOS 端以及 Web 端的自动化测试能力后,外界对于 Windows 端自动化测试框架的呼声越来越高。
QT4C(Quick Test for Client) 作为基于 QTA 提供的面向 Win32 应用的 UI 测试自动化测试框架,此次开源弥补了 QTA 自动化测试项目在 Windows 端能力的不足。QT4C 使用 Python 开发,实现了 Windows 端的 UI 自动化测试,支持多种控件类型的自动化测试,同时支持扩展自定义控件类型,目前被用于 PCQQ、企业微信等产品的自动化测试中。
开源链接
Github 开源地址:https://github.com/Tencent/QT4C
使用文档:https://qt4c.readthedocs.io/zh_CN/latest/index.html
设计文档:https://github.com/Tencent/QT4C/blob/master/design/design.md
请给 QT4C 一个 Star !
欢迎提出你的 issue 和 PR!
功能亮点
多种控件类型支持
QT4C 现支持对 Windows Native 控件、UIA 控件、Web 控件进行自动化测试。
支持无障碍化自动化测试
QT4C 对于 Win32 原生控件支持 MSAA(Microsoft Active Accessibility) 无障碍化测试。在 QT4C 中,通过使用 win32com 模块和 comtypes 模块实现 IAccessible 接口的包裹类,对用户提供封装好的 AccessibleObject 对象进行使用,用户可以通过控件的 AccessibleObject 属性获取并进行无障碍化的自动化测试。
支持控件类型扩展
QT4C 具有良好的扩展性,支持用户根据实际需求对控件类型进行扩展,支持多种使用场景,用户可以针对自研控件实现测试桩注入逻辑,通过扩展新的控件类型对自研控件进行 UI 自动化测试。
支持 PC 端的 Web 自动化测试
QT4C 对于 Windows 端的浏览器同样进行了封装,用户可以在 QT4C 的基础上使用 QT4W 进行 Web 自动化测试,同样支持 Win32 应用的内嵌 Web 自动化测试。目前 QT4C 已经对 IE 浏览器、Chrome 浏览器进行了封装,用户可以直接在 Windows 上使用上述浏览器进行 Web 自动化测试。
设计原理
在 QT4C 中,Windows 中所有的控件类型都可以抽象为 Control 供用户调用,每一种控件类型都继承自 Control 类。对于 Windows 端常见的窗口,QT4C 将其抽象成了 Windows 类,Window 也可以视作特殊的 Control,它既是 Control 的载体,也能够调用 Proxy Object 中封装的方法来进行操作。
QT4C 对每一种控件类型都内置了 Proxy Object,用于获取应用程序的属性或者进行操作,Proxy Object 底层基于注入测试桩或调用被测程序提供的 API 来封装获取属性或操作的接口。
使用说明
QT4C 基于 QPath 技术和 QTA UI 框架,控件封装简单,结构清晰,可以同时使用多种控件类型进行定位,用户可以非常方便地利用 QPath 定位控件并进行自动化测试。关于 QPath 的语法和使用,可以参考 QPath 使用文档。这里以 Windows 自带的计算器为例,展示我们如何利用 QT4C 来对计算器的运算能力进行自动化测试,更多使用说明可参考QT4C 使用文档。
使用 Inspect 获取控件属性
Inspect 是一种 Win32 应用控件抓取工具,你可以使用微软提供的 Inspect.exe 来获取控件,关于微软的 Inspect.exe 的使用,可参考官方文档。
这里使用 Inspect 获取计算器主界面的控件,下面是 Inspect 的截图。
借助 Inspect 工具,就可以获取大部分 Win32 应用中控件的属性来使用 QPath 来对其进行封装。
封装控件
根据 Inspect 获取到的计算器主界面属性,可以写出主界面 MainPanel 的 QPath:
/ClassName='CalcFrame' && Text='计算器' && Visible='True'"
其次对界面中每个按键进行抓取封装,这里建议尽可能通过 ClassName、ControlId 等这些比较容易进行区分的属性来封装控件,例如按键 1 的 QPath 为:
"/ClassName='Button' && MaxDepth='3' && ControlId='0x83'"
这里封装几个接下来要进行自动化测试的按键以及操作逻辑作为参考:
class MainPanel(win.Window):
def __init__(self, qpath=None):
qp = QPath("/ClassName='CalcFrame' && Text='计算器' && Visible='True'")
super(MainPanel, self).__init__(locator=qp)
self.updateLocator({
'按键1': {'type': win.Control, 'root': self, 'locator': QPath("/ClassName='Button' && MaxDepth='3' && ControlId='0x83'")},
'按键2': {'type': win.Control, 'root': self, 'locator': QPath("/ClassName='Button' && MaxDepth='3' && ControlId='0x84'")},
'加号': {'type': win.Control, 'root': self, 'locator': QPath("/ClassName='Button' && MaxDepth='3' && ControlId='0x5D'")},
'等号': {'type': win.Control, 'root': self, 'locator': QPath("/ClassName='Button' && MaxDepth='3' && ControlId='0x79'")},
'结果': {'type': win.Control, 'root': self, 'locator': QPath("/ClassName='Static' && MaxDepth='3' && ControlId='0x96'")}
})
def add (self):
self.wait_for_exist(5, 0.2)
self.Controls['按键1'].click()
self.Controls['加号'].click()
self.Controls['按键2'].click()
self.Controls['等号'].click()
进行自动化测试
在对控件进行封装之后,就可以在测试用例中使用封装好的 MainPanel 类来进行自动化测试,这里以简单的加法运算为例:
mainPanel = MainPanel()
mainPanel.add()
self.assertEqual(mainPanel.Controls['结果'].Text, '3')
自动化测试示例
真诚开源
我们后续会继续完善和优化功能,提升框架稳定性;同时支持远程操作 Windows 机器进行 UI 自动化测试。如果你对这个项目感兴趣,还请给这个项目一个 Star,欢迎提出你的 issue 和 PR!欢迎您和我们一起优化!欢迎加入 QTA 沟通交流群。
(QTA 沟通交流群)
(腾讯 Q 效公众号)