【 GUI自动化测试】GUI自动化测试(一) 环境安装与测试
文章目录
- 一、为什么要做GUI⾃动化
- 1.1 GUI⾃动化的意义
- 1.2 GUI⾃动化适⽤场景
- 二、为什么选择pywinauto
- 2.1pywinauto的优势
- 2.2 pywinauto的局限性
- 三、安装pywinauto
- 四、安装UI对象检查⼯具
- 五、Python 虚拟环境的“环境隔离”核心特性
- 六、GUI⾃动化简单⽰例
- 🚩总结
一、为什么要做GUI⾃动化
1.1 GUI⾃动化的意义
在软件测试过程中,有许多重复性的测试⽤例需要执⾏,例如对软件的各种基本功能进⾏验证。如果⼿动测试,测试⼈员需要不断地重复相同的操作步骤,这不仅耗时⽽且容易出错。⽽GUI⾃动化测试⼯具可以在短时间内快速执⾏⼤量重复的测试⽤例,并且能够始终按照预设的逻辑和步骤进⾏操作,从⽽极⼤地提⾼了测试效率。
通过GUI⾃动化测试,可以减少对⼈⼒的依赖。原本需要多名测试⼈员花费数⼩时甚⾄数天才能完成的测试⼯作,现在只需编写好⾃动化测试脚本,由⾃动化测试⼯具在规定时间内完成,这样可以将测试⼈员从繁琐的重复性⼯作中解放出来,在⼀定程度上降低了⼈⼒成本。
1.2 GUI⾃动化适⽤场景
GUI⾃动化适⽤于各种需要对图形⽤⼾界⾯进⾏重复性、⼀致性测试的场景,尤其在验证软件功能的稳定性、正确性和⽤⼾体验⽅⾯发挥着重要作⽤。
在软件开发的各个阶段,从集成测试到验收测试,它都可以帮助测试⼈员快速发现潜在问题,如界⾯元素是否正常显⽰、交互是否流畅、功能是否按预期⼯作等,从⽽确保软件质量。
GUI⾃动化可以模拟不同⽤⼾环境下的操作,测试其兼容性和稳定性。此外,在进⾏⼤规模测试时,它能显著提⾼测试效率,减少⼈⼒成本,快速提供反馈,⽀持持续集成和持续交付,加速软件开发周期。
总之,GUI⾃动化适⽤于需要⾼效、准确、重复测试GUI应⽤程序的各种场景,有助于提升软件质量、⽤⼾满意度和开发效率。需要注意的是,尽管GUI⾃动化适⽤于上述场景,但其成功依赖于界⾯元素的稳定性⸺若UI频繁变动或涉及复杂交互,维护成本可能陡增。
这个图展示了自动化测试在项目回归测试中的应用逻辑,结合软件版本迭代场景来解释:
- 版本与功能变化
- v1.0版本:包含「功能1 ~ 功能10」,是初始版本的核心功能。
- v2.0版本:在保留「功能1 ~ 功能10」(标注为“历史功能”)的基础上,新增了「功能11 ~ 功能30」(红色框突出显示,代表新版本的新增功能)。
- 自动化测试的作用(解决回归测试问题)
回归测试的核心是:验证“新增/修改功能后,原有历史功能是否仍能正常工作”。
- 首先,在v1.0阶段,会为「功能1 ~ 功能10」编写自动化测试脚本(绿色文字“编写自动化测试脚本”指向v1.0,代表提前为旧功能构建自动化测试能力)。
- 当版本迭代到v2.0(新增了功能11~30)时,需要验证「功能1 ~ 功能10」这些历史功能是否受新版本影响。此时,通过自动化测试(绿色文字“自动化测试”指向v2.0的“历史功能”区域),可以快速、批量地执行原有功能的测试,无需手动重复测试,高效完成回归测试。
简言之,图中用版本迭代的场景,说明“自动化测试能高效解决‘新版本新增功能后,历史功能是否正常’的回归测试问题”。
GUI
-》graphical图形化
GUI自动化测试适用场景:界面不会频繁发生改变,交互不会过于复杂
二、为什么选择pywinauto
Pywinauto是⼀款基于Python的跨平台GUI⾃动化库,专⻔针对Windows桌⾯应⽤程序设计,其核⼼能⼒在于通过模拟⽤⼾交互⾏为(如⿏标点击、键盘输⼊)实现对窗⼝、对话框及内部控件的精准定位与操作,适⽤于⾃动化测试、批量任务处理及⽇常办公流程优化等场景。
该库通过两种底层技术(backend="win32"和backend=“uia”)适配不同框架开发的应⽤程序:
- win32模式适⽤于传统MFC、VB6等旧架构
- uia模式则⽀持现代WinForms、WPF、Qt5及浏览器等应⽤
2.1pywinauto的优势
- 基于Python: Python语言简洁易学,适合快速开发和维护。
- 跨平台支持:支持Windows 7及以上版本,兼容性良好。
- 丰富的控件支持:支持Windows原生控件(如按钮、文本框、表格)以及第三方控件(如WPF、Qt)。
- 动态查找机制:自动等待控件加载完成,无需显式等待。
- 强大的调试工具:提供
pywinauto.findwindows
模块,方便定位控件。 - 社区活跃:开源项目,持续更新,文档和示例丰富。
2.2 pywinauto的局限性
仅⽀持Windows:⽆法⽤于Mac或Linux平台。
对⾮标准控件⽀持有限:某些⾃定义控件可能需要额外处理。
注意:pywinauto
⽀持传统Windows原⽣应⽤框架和部分跨平台框架(需在Windows运⾏),以下是⼀些⽆法使⽤
pywinauto
实现GUI⾃动化的应⽤程序分类,以及原因:
- 基于Web的应⽤程序
原因:pywinauto 是为本地Windows应⽤程序设计的,⽆法直接与基于浏览器的Web应⽤
程序交互。Web应⽤程序的⾃动化通常需要使⽤如Selenium这样的⼯具。
⽰例:GoogleChrome中打开的任何⽹⻚或基于Web的企业应⽤。
- 基于⾃定义渲染引擎的应⽤程序
◦
原因:某些应⽤程序(如使⽤Flutter、ReactNative或其他跨平台框架开发的应⽤)可能使⽤
⾃定义的渲染引擎,这些引擎不会暴露标准的WindowsUI⾃动化接⼝(如Win32或UIA)。
⽰例:企业微信、某些使⽤Flutter开发的桌⾯应⽤。
如何分辨什么是基于Web的应⽤程序、使⽤⾃定义渲染框架的应⽤程序?这些在⽬前看起来确实很难。如何分辨是否能⽤pywinauto
进⾏⾃动化测试的应⽤程序,在后⾯的“安装UI对象检查⼯具”内容中,再来讲解
三、安装pywinauto
- 安装Python:确保已安装Python环境(推荐3.7或更⾼版本)。
pip install pywinauto==0.6.9
安装完成后,可以通过以下命令验证安装:
pip list
如果输出中包含pywinauto,则说明安装成功。
四、安装UI对象检查⼯具
在讲解selenium实现web⾃动化时,定位⻚⾯的元素是必须要的,如何进⾏元素定位?打开⻚⾯开发者⼯具,可以直接进⾏元素定位,定位到元素之后才能对指定元素进⾏⼀系列的操作,对于GUI⾃动化也是⼀样,要想对界⾯的元素进⾏操作,我们得先会“找元素”,⽽找元素我们需要⽤UI对象检查⼯具,
UI对象检查⼯具有很多,诸如Spy++、Inspect.exe、UISpy,这些⼯具基本都⻓得⼀样,且操作上基
本⽆差,上课我们统⼀使⽤UISpy⼯具来进⾏UI对象检查。
- UISpy是⼀款由微软提供的⼯具,专⻔⽤于UI⾃动化测试。它允许测试⼈员查看应⽤程序的UI⾃动化模型,包括控件树、属性和事件。UISpy特别适⽤于编写UI⾃动化脚本,因为它提供了⼀个可视化的界⾯来帮助测试⼈员选择UI元素,并且可以模拟⽤⼾对这些UI元素的操作。
是否还记得,我们在“pywinauto局限性”内容中还遗留了⼀个问题:“如何分辨是否能⽤pywinauto 进⾏⾃动化测试的应⽤程序”,在这⾥我们可以跟⼤家公开答案了,应⽤程序可以通过UI对象检查⼯具定位到元素,说明该元素的实现是⽀持传统Windows原⽣应⽤框架,⽽⽆法识别的元素则属于“不能⽤pywinauto进⾏⾃动化测试的”。
五、Python 虚拟环境的“环境隔离”核心特性
-
左侧:Python 通用库(全局环境)
这是系统级/全局的 Python 环境,安装了requests
、yaml
、pytest
、pywinauto
等库。所有不使用“虚拟环境”的项目,都会直接依赖这个全局环境的库。 -
中间:虚拟环境(Test01 项目)
下方说明“每个项目独有一份环境,单独来管理所需要的库”,体现了虚拟环境的核心作用:
- 虚拟环境是项目专属的“独立 Python 环境”,与全局环境、其他项目的虚拟环境完全隔离。
- 图中 Test01 的虚拟环境里,只安装了
requests
库——这说明 Test01 项目仅需要requests
,因此只需在自己的虚拟环境中安装这一个库,无需依赖全局环境的所有库,也不会受其他库(如pytest
)的版本干扰。
- 右侧:虚拟环境(Test02 项目)
Test02 的虚拟环境里安装了pytest
和pywinauto
库——这说明 Test02 项目的依赖是pytest
和pywinauto
,它的虚拟环境与全局环境、Test01 的环境完全隔离,库的安装/版本仅服务于 Test02 自身。
核心意图:解释虚拟环境的价值
虚拟环境的本质是为每个项目打造“独立的依赖空间”,解决以下问题:
- 避免“全局环境库版本冲突”:比如项目 A 需要
requests==2.20
,项目 B 需要requests==3.0
,虚拟环境可让两个项目各自用自己的版本。 - 精简依赖:项目只需安装自身需要的库,无需承载全局环境的所有依赖,更轻量、可控。
六、GUI⾃动化简单⽰例
⽰例:打开电脑⾃带记事本,输⼊内容,并保存⽂件。
第一种安装方法
第二种安装指令安装
代码:
import time
from pywinauto.application import Application# 启动应用程序
app = Application(backend="uia").start("notepad.exe") # 这里直接赋值给app
time.sleep(3) # 等待记事本启动# 连接到已启动的记事本
app.connect(title_re=".*Notepad")# 获取窗口
notepad = app.window(title_re=".*Notepad")# 输入文本
notepad.Document.type_keys("Hello, Pywinauto!")# 等待1秒看效果
time.sleep(1)# 关闭应用程序
notepad.close()
效果:自动写文本文件测试,自动关闭