pytest+uiautomation+allure 数据驱动桌面自动化项目搭建指南-yaml版本
本文基于pytest uiautomation allure技术栈搭建一套数据驱动DDT的 Windows 桌面应用自动化测试框架。彻底实现测试数据与业务代码分离适配多组测试数据、批量回归测试兼容企业级桌面客户端自动化场景支持精美可视化测试报告生成。一、技术栈说明uiautomation微软原生 Windows UI 自动化库稳定无依赖适配所有标准桌面控件pytest测试用例管理、执行、断言、数据驱动参数化核心框架allure-pytest生成交互式可视化测试报告支持失败截图、用例分级、步骤展示数据驱动模式独立存放测试数据代码只写一次批量执行多组测试场景易维护、可复用二、完整环境准备1. 安装核心依赖库# 安装自动化核心库、报告库、数据处理库pipinstallpytest uiautomation allure-pytest pyyaml2. Allure 报告工具安装必备适配最新稳定版 Allure 2.41.0修复旧版 XSS 漏洞、依赖兼容问题下载地址Allure 官方 Releases选择 2.41.0 版本 Windows 安装包解压压缩包将内部bin目录配置到系统环境变量cmd 验证安装是否成功allure--version三、数据驱动版项目目录结构工程化标准新增data 测试数据目录实现代码、数据、页面、用例完全解耦desktop_automation/ ├── config/ # 全局配置目录 │ └── setting.py # 应用路径、等待时间、全局配置 ├── data/ # 【数据驱动核心】测试数据目录 │ └── notepad_data.yml # yml格式测试用例数据 ├── page/ # PO页面对象层 │ ├── base_page.py # 基础公共操作封装 │ └── notepad_page.py # 业务页面控件方法 ├── testcase/ # 测试用例层纯逻辑无硬编码数据 │ └── test_notepad.py # 数据驱动测试用例 ├── report/ # 自动生成测试报告 │ ├── temp/ # allure原始数据 │ └── html/ # 最终可视化报告 ├── conftest.py # pytest全局钩子、失败截图 └── pytest.ini # pytest全局配置四、全局配置文件config/setting.py# 被测应用配置APP_PATHnotepad.exe# 全局隐式等待时间IMPLICIT_WAIT3# 测试数据文件路径TEST_DATA_PATH./data/notepad_data.yml五、数据驱动核心测试数据文件采用YAML存储测试数据支持多组场景、测试描述、预期结果无需修改代码即可新增/删除用例data/notepad_data.yml# 记事本输入测试-数据驱动test_input_data:-case_name:普通文本输入测试input_content:pytestuiautomation 桌面自动化expect_content:pytestuiautomation 桌面自动化-case_name:特殊符号输入测试input_content:测试123!#$%^*()expect_content:测试123!#$%^*()-case_name:空内容输入测试input_content:expect_content:-case_name:长文本输入测试input_content:数据驱动自动化测试代码与数据分离高效维护用例expect_content:数据驱动自动化测试代码与数据分离高效维护用例六、PO页面封装层1. 基础公共页面 page/base_page.py封装所有桌面应用通用操作统一等待、点击、输入、截图、元素判断方法所有业务页面继承此类importuiautomationasautoimporttimefromconfig.settingimportIMPLICIT_WAITclassBasePage:def__init__(self):# 全局控件查找间隔防止操作过快报错auto.SetGlobalSearchInterval(0.1)auto.SetGlobalSearchTimeout(IMPLICIT_WAIT)self.app_windowNonedefstart_app(self,app_path:str):启动桌面应用auto.Run(app_path)time.sleep(IMPLICIT_WAIT)defget_window(self,window_name:str):定位应用主窗口self.app_windowauto.WindowControl(Namewindow_name,searchDepth1)returnself.app_windowdefclose_app(self):关闭应用窗口ifself.app_windowandself.app_window.Exists(0):self.app_window.Close()time.sleep(1)defclick_control(self,control,wait_time1):通用控件点击方法ifcontrol.WaitForExist(wait_time):control.Click()time.sleep(0.5)definput_text(self,control,text:str,wait_time1):通用文本输入方法ifcontrol.WaitForExist(wait_time):control.SendKeys(text)time.sleep(0.5)defget_control_text(self,control):获取控件文本内容ifcontrol.WaitForExist(1):returncontrol.Nameifcontrol.Nameelsecontrol.DocumentTextreturn2. 业务页面 page/notepad_page.py仅封装页面控件和业务方法不写测试数据、不写断言完全解耦importuiautomationasautofrompage.base_pageimportBasePageclassNotePadPage(BasePage):def__init__(self):super().__init__()# 页面控件定位self.window_name无标题 - 记事本self.edit_areaauto.EditControl(searchDepth2)definput_edit_content(self,content:str):记事本输入指定内容self.input_text(self.edit_area,content)defget_edit_content(self):获取记事本输入框内容returnself.get_control_text(self.edit_area)七、数据驱动测试用例层核心改造点通过 pytest 读取 YAML 数据参数化批量执行用例代码复用数据灵活配置testcase/test_notepad.pyimportpytestimportyamlfrompage.notepad_pageimportNotePadPagefromconfig.settingimportAPP_PATH,TEST_DATA_PATH# 读取YAML测试数据defget_test_data():withopen(TEST_DATA_PATH,r,encodingutf-8)asf:datayaml.safe_load(f)returndata[test_input_data]classTestNotePadDDT:# 全局前置启动应用defsetup_class(self):self.pageNotePadPage()self.page.start_app(APP_PATH)self.page.get_window(self.page.window_name)# 全局后置关闭应用defteardown_class(self):self.page.close_app()# 数据驱动参数化执行pytest.mark.parametrize(case,get_test_data(),idslambdax:x[case_name])deftest_notepad_input_ddt(self,case):记事本多场景数据驱动输入测试# 从数据文件读取参数input_contentcase[input_content]expect_contentcase[expect_content]# 执行业务操作self.page.input_edit_content(input_content)actual_contentself.page.get_edit_content()# 断言校验assertactual_contentexpect_content,f用例失败预期{expect_content}实际{actual_content}八、全局钩子与配置conftest.py失败自动截图allure绑定importpytestimportallureimportuiautomationasauto# 用例失败自动截图并嵌入allure报告pytest.hookimpl(tryfirstTrue,hookwrapperTrue)defpytest_runtest_makereport(item,call):outcomeyieldreportoutcome.get_result()# 仅用例执行阶段失败时截图ifreport.whencallandreport.failed:try:picauto.CaptureToImage()allure.attach(pic,name失败截图,attachment_typeallure.attachment_type.PNG)exceptExceptionase:print(f截图失败{str(e)})pytest.ini全局运行配置[pytest] # 用例扫描路径 testpaths testcase # 用例文件命名规则 python_files test_*.py # 测试类命名规则 python_classes Test* # 测试方法命名规则 python_functions test_* # 运行参数 allure原始数据输出路径 addopts -vs --alluredir./report/temp --clean-alluredir九、项目运行命令1. 执行所有数据驱动用例pytest2. 生成并打开Allure可视化报告# 生成静态报告allure generate ./report/temp-o./report/html--clean# 打开报告页面allureopen./report/html十、uiautomation元素定位核心方法1. 定位工具必备系统自带工具C:\\Program Files \(x86\)\\Windows Kits\\10\\bin\\x64\\inspect\.exe轻量化工具命令行执行python \-m uiautomation\.inspect核心抓取属性AutomationId最优、Name、ClassName、ControlType2. 优先级排序从稳到次AutomationId唯一固定标识适配动态窗口优先使用Name显示文本适合固定文案按钮、标签层级嵌套定位父窗口子控件解决重名控件问题模糊匹配NameContains 适配动态变化文本foundIndex下标适配同类型多个控件3. 常用控件定位示例# 主窗口auto.WindowControl(Name应用窗口名)# 输入框auto.EditControl(AutomationIdinputId)# 按钮auto.ButtonControl(Name确认)# 文本标签auto.TextControl(Name账号)# 复选框auto.CheckBoxControl(Name记住密码)十一、数据驱动框架核心优势低耦合易维护测试数据独立存放新增场景无需修改代码仅编辑YAML文件批量高效执行单条用例逻辑批量多组数据执行大幅减少冗余代码报告清晰allure报告按用例名称区分每组数据执行结果失败自动截图溯源适配企业场景可扩展登录、表单、弹窗、列表等多业务数据驱动场景稳定性强基于微软原生UI接口无图像识别偏差适配绝大多数Windows客户端十二、常见问题解决方案元素定位失败增大 searchDepth 层级、开启全局等待、先定位父窗口再找子控件用例执行过快报错调整全局隐式等待时间控件操作增加显性等待allure报告为空执行 pytest 必须携带\-\-alluredir参数清理旧数据YAML数据读取失败保证文件编码为utf-8格式缩进规范总结本框架基于数据驱动模式完成全套桌面自动化搭建彻底区分配置层、数据层、页面层、用例层完全符合企业级自动化工程规范。可直接迁移适配ERP、后台客户端、办公软件等所有Windows桌面应用只需替换控件定位和测试数据即可快速落地批量回归测试。