最近公司有一个程序需要进行测试,其中有个测试目标是测试程序执行的成功率,我考虑肯定不能使用手工测试,必须要通过自动化测试来完成测试目标,并且这个程序大部分工作是单机完成的,接口自动化测试也无法满足要求,所以必须使用面向 windows 程序的 UI 自动化测试来达成。
目前软件自动化测试 99% 都是针对 WEB 端的,不论是 PC 侧还是安卓侧,对 windows 程序的 UI 自动化测试网上资料极少,我自己知道的仅有 QTP 这个工具,但是因为 QTP 工具太重,脚本维护也麻烦,所以我不准备采用这个工具来测试,我跟几个同行咨询请教后,首先了解到 Appium 可以用来进行 windows 的 UI 自动化测试,在网上查找相关资料后,发现大部分也都是安卓和 pc 的 WEB 自动化测试的资料,还有一个问题是这些资料和教程散碎不成体系,无法让我了解完整的自动化测试过程,我只能继续在网上查找资料,在这个过程中我又了解到,Appium 可以和 Winappdriver 一起进行自动化测试,在网上找到相关教程并按教程步骤进行环境搭建后,又出现了一个问题,Appium 无法打开测试目标程序,程序报配置文件无法加载,把测试目标程序换为暴风影音后,可以正常拉起暴风的程序,却无法分析出暴风的 windows 元素,也无法进行录制,因为这种种原因,我放弃了使用 Appium+Winappdriver 进行测试的方案。
在之前的方案失败后,我又查询了很多资料,从某篇文章得知有个 UIAutomation 工具可以做 windows 程序的 UI 自动化测试,并且比 Appium 更方便快捷,于是我开始了对这个工具的学习研究,从 1997 年开始,微软就在 windows 中集成了 MSAA 组件 (Microsoft Active Accessibility),这套组件本质上就是一组 COM 接口,让开发者可以方便的开发残疾人士辅助软件,后来慢慢被应用到了自动化测试工作中,衍生出了 UIAutomation 测试工具,并且 QTP、Fuctional Test 和 Silk Test 等工具也是通过 MSAA 完成与 windows 控件控制和信息交互的。
UIA 很适合我的测试场景,但是 UIA 是基于 C# 语言的,本人对 C# 研究不深,而且 C# 编程环境需要安装 VS CODE,整个开发环境太重,我感觉不太合适,但是这个时候在检索 UIAutomation 的结果中出现了一个不同的东西,一个名称一样的工具,却是一位 yinkaisheng 大佬使用 C++ 和 Python 对 MSAA 接口进行封装并发布在 GitHub 上的,可以使用纯 Python 进行自动化脚本开发,经过对这个模块的试用,我发现这个工具非常适合我的测试,终于测试工具确定下来了。
根据评论大佬的建议,我去了解了一下 airtest 自动化测试工具,windows 版的测试工具很小巧,而且界面功能一看就很容易上手,录制和抓取的功能非常简单,可惜的是 airtest 三种方式都无法识别我的待测程序,所以试验到此结束,我又在网上搜了一下别人的使用体验,应该说这个工具更适合移动端的测试,所以我还是决定采用原有的方式进行自动化测试,用 Inpsect 和 automation.py 进行元素抓取,用 uiautomation 和 unittest 进行用例编写。
试用代码:
import os
import subprocess
import uiautomation
import time
#打开计算器进程
subprocess.Popen('calc.exe')
time.sleep(2)
#定位窗口
wc=uiautomation.WindowControl(searchDepth=1,Name='计算器')
#设置为顶层
wc.SetTopmost(True)
wc.ButtonControl(Name='7').Click()
wc.ButtonControl(Name='加').Click()
wc.ButtonControl(Name='5').Click()
wc.ButtonControl(Name='等于').Click()
result=wc.TextControl(AutomationId='158')
print(result.Name)
if result.Name=="12":
print("测试成功")
else:
print("测试失败")
#截图
wc.CaptureToImage('1.png')
time.sleep(2)
wc.ButtonControl(Name='关闭').Click()
os.system("taskkill /F /IM calc.exe")
#截图
wc.CaptureToImage('1.png')
time.sleep(2)
wc.ButtonControl(Name='关闭').Click()
os.system("taskkill /F /IM calc.exe")
参考文章:Python 下编写 Windows 自动化测试软件 (https://www.jianshu.com/p/be3c46c7a905)
介绍 MSAA,UIA ,Windows Automation API(https://blog.csdn.net/popeer/article/details/6855639)
UI 自动化和 Microsoft Active Accessibility(https://docs.microsoft.com/zh-cn/dotnet/framework/ui-automation/ui-automation-and-microsoft-active-accessibility)