基于Appium+pytest+Allure的App UI自动化测试框架实战(含完整项目架构与落地指南)

news2026/3/20 17:55:58
前言在移动应用测试中UI自动化测试能有效降低重复手工测试成本提升版本迭代的回归测试效率。本文将详细分享一套基于AppiumpytestPythonAllure构建的高可维护、易扩展的App UI自动化测试框架包含完整的项目架构设计、环境配置、测试流程、功能落地及版本迭代记录适用于Android平台的移动应用测试支持真机与模拟器可直接复用至实际项目。一、框架核心架构与技术选型1.1 技术栈选型核心工具Appium移动端自动化测试核心支持跨平台测试框架pytestPython单元测试框架支持用例管理、参数化、夹具等报告工具Allure生成美观、详尽的测试报告支持趋势分析、缺陷追踪开发语言Python 3.7语法简洁生态丰富自动化脚本开发效率高辅助工具Java SDKAppium运行依赖、Android SDKAndroid设备调试依赖、Excel/YAML测试数据与元素配置管理1.2 完整项目目录结构project_root/ ├── actions/ # 页面元素操作封装目录 │ ├── test_actions.py # 页面元素操作抽象封装点击、输入、滑动等 │ └── ... ├── common/ # 底层核心封装目录框架基石 │ ├── basepage.py # 基础页面对象类封装通用操作查找元素、等待、截图等 │ ├── driver.py # 驱动管理Appium服务连接、设备启动、驱动销毁 │ ├── file_load.py # 文件读取封装Excel/YAML/配置文件解析 │ ├── install.py # 安装包管理自动下载、安装、卸载APP │ ├── logger.py # 日志封装按级别记录操作日志便于问题排查 │ └── ... ├── config/ # 配置文件目录 │ ├── appium_config.yaml # Appium核心配置设备信息、APP信息、服务端口等 │ └── ... ├── logs/ # 日志文件输出目录按日期/用例分类存储 ├── data/ # 测试数据目录 │ ├── test_app.xlsx # 测试数据文件登录账号、用例参数等支持数据驱动 │ └── ... ├── pagefiles/ # 页面元素配置目录元素定位器集中管理 │ ├── test_app.yaml # 页面元素配置By.ID/XPATH/CLASS_NAME 定位表达式 │ └── ... ├── pages/ # 页面对象模型POM目录 │ ├── loginpage.py # 登录页封装元素定位页面操作输入账号、点击登录等 │ ├── minepage.py # 我的页面封装 │ └── ... ├── reports/ # Allure测试报告目录自动生成支持HTML查看 ├── testcases/ # 测试用例目录按模块划分 │ ├── test_login.py # 登录模块测试用例 │ ├── test_mine.py # 我的页面测试用例 │ └── ... ├── video/ # 测试过程截图/视频目录失败用例自动截图便于复现 ├── conftest.py # pytest夹具配置全局前置/后置操作启动驱动、初始化页面等 ├── pytest.ini # pytest核心配置用例发现规则、日志级别、插件配置等 ├── requirements.txt # 项目依赖清单便于环境一键部署 ├── run.py # 测试执行入口支持指定用例、模块、生成报告等 ├── README.md # 项目说明文档环境搭建、使用教程、注意事项 └── setting.py # 全局设置项目根路径、文件路径配置等1.3 核心目录功能说明目录/文件核心功能actions/封装通用页面操作如滑动、弹窗处理、数据校验解耦页面对象与操作逻辑提升复用性common/框架底层支撑封装所有通用能力避免重复编码降低维护成本config/集中管理配置参数无需修改代码即可调整测试环境、设备信息提升灵活性data/测试数据与代码分离支持数据驱动测试如多账号登录、多场景参数化pagefiles/页面元素定位器集中管理避免硬编码元素变更时仅需修改配置文件pages/采用POM设计模式每个页面对应一个类封装页面元素与操作提升代码模块化程度testcases/按业务模块组织测试用例遵循pytest规范支持用例分组、跳过、依赖等conftest.py全局夹具配置统一管理测试前置如启动APP、登录和后置如关闭APP、清理数据操作run.py一键执行入口支持命令行参数如–modulelogin、–reportallure二、环境搭建与配置详细步骤2.1 软件环境依赖依赖工具版本要求作用说明Python3.7脚本开发与运行环境Appium Server1.22移动端自动化测试核心服务提供设备与脚本的通信能力Java SDK8Appium运行依赖需配置JAVA_HOME环境变量Android SDKAPI 26对应安卓8.0Android设备调试依赖需配置ANDROID_HOME安装platform-tools、build-toolsAllure Command Line2.13生成Allure测试报告需配置ALLURE_HOME环境变量模拟器/真机安卓8.0-14.0测试执行载体推荐雷电模拟器、夜神模拟器支持多设备并行2.2 环境搭建步骤1Python环境配置下载Python 3.7版本Python官网安装后配置环境变量确保python --version和pip --version命令可执行安装项目依赖创建requirements.txt文件执行pip install -r requirements.txt# requirements.txt appium-python-client2.10.0 pytest7.4.3 allure-pytest2.13.2 openpyxl3.1.2 pyyaml6.0.1 loguru0.7.2 selenium4.15.22Appium与Java/Android SDK配置安装Java SDKJava官网下载配置JAVA_HOME例C:\Program Files\Java\jdk1.8.0_301并添加bin目录到Path安装Android SDK推荐通过Android Studio安装或单独下载SDK Tools配置ANDROID_HOME例C:\Users\XXX\AppData\Local\Android\Sdk安装Appium Server推荐使用Appium Desktop下载地址或通过npm安装npm install -g appium需先安装Node.js3模拟器/真机配置模拟器推荐雷电模拟器安装教程、夜神模拟器安装教程真机配置开启开发者模式打开USB调试连接电脑后通过adb devices命令验证设备是否识别关键配置修改config/appium_config.yaml中的platformVersion对应安卓系统版本、deviceName设备名称通过adb devices -l获取三、核心模块实现与关键代码3.1 驱动管理common/driver.py封装Appium驱动的创建与销毁支持自动连接设备、启动APP避免重复编码fromappiumimportwebdriverfromappium.options.androidimportUiAutomator2Optionsfromcommon.loggerimportloggerimportyamlimportosfromsettingimportCONFIG_PATHclassDriverManager:def__init__(self):# 加载Appium配置self.config_pathos.path.join(CONFIG_PATH,appium_config.yaml)withopen(self.config_path,r,encodingutf-8)asf:self.configyaml.safe_load(f)defget_driver(self):创建并返回Appium驱动try:optionsUiAutomator2Options()# 配置设备与APP信息options.set_capability(platformName,self.config[platformName])options.set_capability(platformVersion,self.config[platformVersion])options.set_capability(deviceName,self.config[deviceName])options.set_capability(appPackage,self.config[appPackage])options.set_capability(appActivity,self.config[appActivity])options.set_capability(noReset,self.config[noReset])# 不重置APP数据options.set_capability(unicodeKeyboard,True)# 支持中文输入options.set_capability(resetKeyboard,True)# 连接Appium Serverdriverwebdriver.Remote(self.config[appiumServer],optionsoptions)logger.info(f✅ 成功连接Appium Server启动APP{self.config[appPackage]}/{self.config[appActivity]})returndriverexceptExceptionase:logger.error(f❌ 驱动创建失败{str(e)})raisedefquit_driver(self,driver):销毁驱动ifdriver:driver.quit()logger.info(✅ 驱动已销毁APP已关闭)3.2 页面对象模型POM示例pages/loginpage.py采用POM设计模式将页面元素与操作封装为类提升代码可读性与维护性fromcommon.basepageimportBasePagefrompagefiles.test_app.yamlimportLoginPageElements# 页面元素配置fromcommon.loggerimportloggerclassLoginPage(BasePage):def__init__(self,driver):super().__init__(driver)self.elementsLoginPageElements# 加载页面元素定位器definput_username(self,username):输入用户名self.send_keys(self.elements[username_input],username)logger.info(f输入用户名{username})definput_password(self,password):输入密码self.send_keys(self.elements[password_input],password)logger.info(f输入密码******)defclick_login_btn(self):点击登录按钮self.click(self.elements[login_btn])logger.info(点击登录按钮)deflogin(self,username,password):完整登录流程self.input_username(username)self.input_password(password)self.click_login_btn()# 等待登录成功跳转到首页self.wait_for_element(self.elements[home_tab],timeout10)logger.info(f✅ 登录成功{username})3.3 测试用例示例testcases/test_login.py遵循pytest规范支持数据驱动、夹具调用用例简洁清晰importpytestfrompages.loginpageimportLoginPagefromdata.test_app.xlsximportget_login_data# 从Excel读取测试数据fromcommon.loggerimportlogger# 数据驱动读取登录测试数据账号、密码、预期结果pytest.mark.parametrize(username, password, expected,get_login_data())deftest_login(driver,username,password,expected):登录功能测试用例login_pageLoginPage(driver)login_page.login(username,password)# 断言验证登录后是否跳转到首页assertdriver.find_element(*login_page.elements[home_tab]).is_displayed(),expectedpytest.mark.skip(reason暂不执行)deftest_login_empty_username(driver):测试用户名空输入登录login_pageLoginPage(driver)login_page.input_password(123456)login_page.click_login_btn()# 断言提示请输入用户名assertlogin_page.get_toast_text(请输入用户名),用户名空输入未提示3.4 一键执行脚本run.py支持指定模块、生成Allure报告、日志输出等功能简化测试执行流程importosimportsysimportpytestfromsettingimportPROJECT_ROOT,REPORTS_PATH,LOGS_PATHdefrun_test():# 构造pytest命令args[-s,-v,# 显示详细日志与打印信息--alluredir,os.path.join(REPORTS_PATH,allure-results),# 生成Allure结果文件--clean-alluredir,# 清空之前的测试结果--log-level,info,# 日志级别os.path.join(PROJECT_ROOT,testcases),# 测试用例目录# -m, login, # 仅执行标记为login的用例可选]# 执行测试exit_codepytest.main(args)# 生成Allure报告可选执行完成后自动生成HTML报告ifexit_code0:os.system(fallure generate{os.path.join(REPORTS_PATH,allure-results)}-o{os.path.join(REPORTS_PATH,allure-report)}--clean)print(f✅ 测试执行完成报告路径{os.path.join(REPORTS_PATH,allure-report,index.html)})else:print(f❌ 测试执行失败退出码{exit_code})returnexit_codeif__name____main__:sys.exit(run_test())四、测试流程与执行规范4.1 完整测试流程1准备阶段环境校验确认Python、Appium、Java SDK、Android SDK已安装并配置成功设备准备启动模拟器或连接真机通过adb devices验证设备连接配置更新修改config/appium_config.yaml中的platformVersion、deviceName等参数APP安装自动安装最新版测试APP框架支持自动获取生产包并安装见版本升级记录数据准备确保测试数据无缓存卸载重装APP或清除数据缓存2测试执行运行run.py脚本框架自动执行以下操作启动Appium驱动连接设备并启动APP按用例顺序执行测试支持跳过、依赖等逻辑失败用例自动截图记录详细日志关注测试通过率要求核心功能通过率≥90%3结果反馈生成Allure报告包含用例通过率、执行时间、缺陷分布、趋势分析等结果同步将测试报告、BUG记录通过钉钉群发送给开发、产品相关人员BUG记录按严重程度blocker/critical/normal/minor记录缺陷附截图与复现步骤4后续改进协同开发修复BUG验证修复效果回归测试对修复后的版本执行相关用例确保问题已解决且无新回归缺陷用例优化定期更新测试用例覆盖新增功能与高频场景4.2 执行时间安排日常迭代每次小版本更新后执行对应模块的回归测试大版本更新提前通知测试人员执行全量回归测试建议在发布前1-2天完成定时执行框架支持定时脚本执行见版本升级记录可配置每日凌晨自动执行核心用例五、测试结果与报告展示5.1 执行结果统计整体通过率82.05%可通过Allure报告查看详细趋势缺陷分布按优先级划分blocker0个critical2个normal5个minor8个执行效率全量250用例执行时间约30分钟单设备5.2 Allure报告亮点直观展示用例通过率、执行时间、缺陷分布支持用例失败截图、日志关联便于快速定位问题提供历史趋势分析跟踪版本质量变化支持按模块、优先级、状态筛选用例六、注意事项与优化建议6.1 执行注意事项测试前需清除APP缓存或卸载重装避免历史数据影响测试结果执行用例时严格遵循用例描述避免操作失误导致误判遇到blocker级别的BUG立即反馈给开发团队同步记录在测试报告中定期检查Appium Server版本与手机系统版本兼容性避免因版本不匹配导致的驱动异常6.2 框架优化方向多设备并行执行集成pytest-xdist支持多设备同时执行用例提升效率元素智能等待优化basepage中的等待逻辑采用显式等待重试机制提升用例稳定性测试数据加密对敏感测试数据如账号密码进行加密存储增强安全性报告自动推送集成企业微信/钉钉机器人测试完成后自动推送报告链接失败重跑配置pytest-rerunfailures插件支持失败用例自动重跑降低偶发失败影响七、总结本框架基于AppiumpytestAllure构建采用POM设计模式、数据驱动思想实现了测试代码与配置、数据的解耦具备高可维护性、易扩展性和实用性。有效提升了版本迭代的回归测试效率。参考链接Appium官方文档https://appium.io/docs/en/latest/pytest官方文档https://docs.pytest.org/en/latest/Allure报告使用https://blog.csdn.net/yx13816403463/article/details/142695453雷电模拟器安装https://jingyan.baidu.com/article/46650658628405b449e5f88e.html夜神模拟器安装https://cloud.tencent.com/developer/article/2291994

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2426869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…