一、框架核心价值
跨平台· 自动化 · 可扩展 · 易维护
- 支持 Android/iOS 双平台统一测试
- 基于 Appium + Pytest 架构
- 分层设计,高内聚低耦合
- 配置与数据驱动,灵活可拓展
- CI/CD 就绪,支持 Jenkins 流水线集成
二、运行流程图
执行步骤:
1. 启动Appium:判断状态,已启动的不再启动;未启动的启动Appium。
2. 创建Appium driver:优先获取jenkins指定配置,再匹配配置文件,获取所测设备信息和相关参数,启动driver
3. 执行测试用例:根据driver信息判断平台,在相应设备上执行相应平台的测试用例,同步生成日志和截图
4. 清理测试环境:执行结束关闭driver,判断appium是否还有其他测试任务,没有则关闭Appium
5. 生成测试报告:整理收集测试结果,生成XML、HTML测试报告。

三、详细设计
完整项目结构树
AppAutomationTest/
├─ base/ # 基础层:页面对象基类
│ └─ base_page.py # 定义所有页面基类
│ ├─ coreAction.py # 核心业务逻辑封装
│
├─ common/ # 通用工具层
│ ├─ data_loader.py # 配置加载逻辑
│ ├─ log_util.py # 日志工具类
│ └─ screenshot_util.py # 截图工具类
│
├─ datas/ # 配置层:存放环境配置信息
│ └─ config.yml # 配置(Appium、设备信息等)
│ └─ data.yml # 数据(账号密码、测试数据等)
│
── core/ # 核心驱动层
│ ├─ core_driver.py # Driver的初始化与获取
│ └─ driver_options.py # 不同平台Capabilities
│
├─ locators/ # 元素定位层
│ ├─ locators_android.py # Android元素
│ └─ locators_ios.py # iOS元素
│
├─ page/ # 页面对象层(POM)
│ ├─ bottom_bar.py # 底部导航栏组件
│ ├─ contacts_page.py # 通讯录页面对象
│ ├─ discovery_page.py # 发现页页面对象
│ ├─ message_page.py # 消息页页面对象
│ └─ wechat_page.py # 微信主页面对象
│
├── services/ # 服务层
│ └─ appium_service.py # Appium服务
│
├─ tests/ # 测试用例层
│ ├─ base_test.py # 测试基类
│ └─ test_message.py # 具体的测试用例脚本
│
├─ logs/ # 测试日志目录
├─ reports/ # 测试报告目录
├─ screenshots/ # 截图目录
│
├─ conftest.py # Pytest 核心配置文件
├─ pytest.ini # Pytest 运行配置文件
├─ README.md # 项目说明文档
├─ report_hooks.py # 自定义增强 HTML报告钩子
├─ requirements.txt # Python 依赖包列表
└─ run.py # 本地调试入口脚本
移动端自动化测试框架架构设计亮点解析
1. 分层解耦架构
框架采用经典的分层设计理念,实现各模块高度解耦。
最显著特征是locators 与 page 分离:元素定位器(数据)与页面操作(逻辑)完全分开,当UI变化时只需修改locators目录下的定位器文件,无需改动page中的业务代码,极大降低维护成本。同时,common 模块复用:日志、截图、配置加载等基础设施统一管理,确保测试执行一致性和报告格式标准化,避免重复造轮子。
2. 数据与测试用例分离
框架严格遵循数据驱动测试理念,实现data.yml 与 test_case.py 分离。
所有测试数据(用户凭证、消息内容、预期结果等)统一存储于YAML配置文件中,而测试用例专注于业务流程验证。这种分离设计使同一套测试逻辑能够驱动多组数据执行,一份代码+ 多套数据 = 更高测试覆盖率,非技术人员也能直接维护测试数据,提升团队协作效率。
3. 核心驱动程序化管理
框架内置services/appium_service.py 支持程序化控制Appium服务,实现一键启动/停止Appium Server。这在Jenkins CI/CD流水线中至关重要,能够确保每次测试都在纯净独立的环境中开始,彻底避免端口占用、服务残留等问题,实现测试环境的自包含和自清理,为自动化流水线提供可靠基础设施保障。
4. 配置外部化设计理念
本框架采用配置完全外部化的设计原则,将所有运行时可变的参数从代码中剥离,集中存储于结构化的配置文件中。通过configs/config.yml和common/config_loader.py的协同工作,实现了测试代码与运行环境的彻底解耦,确保同一套测试代码能够无缝适应不同执行环境的需求。
5. Pytest生态系统深度集成
框架深度集成Pytest先进特性,通过conftest.py 和 pytest.ini 充分利用Fixture机制管理测试生命周期。report_hooks.py 自定义报告钩子增强了测试报告展示效果,能够自动关联测试步骤、失败截图和环境信息。这种深度集成不仅带来优雅的测试组织方式,还提供强大的扩展能力和定制灵活性,满足复杂测试场景的多样化需求。
6. 智能化输出与归档管理
测试结果采用结构化归档策略,reports/ 和 screenshots/ 独立目录存储,配合Jenkins的archiveArtifacts步骤,实现测试产物的自动归档和历史追溯。智能截图机制在测试失败时自动捕获界面状态,为问题分析提供直观依据,极大缩短故障排查时间。时间戳目录结构确保每次执行结果独立保存,便于对比分析。
架构优势总览
该框架的六大设计亮点共同构建了高度模块化、可维护、可扩展的测试解决方案:
- 数据分离:data.yml独立管理测试数据,支持数据驱动测试
- 驱动管理:appium_service.py程序化控制,保障CI/CD环境纯净
- 配置外部化:config.yml统一配置,支持一键环境切换
- Pytest集成:conftest.py + pytest.ini + report_hooks.py标准化测试管理智能归档:reports + screenshots + Jenkins流水线,实现结果可追溯
整体架构层次
本框架采用清晰的分层架构设计,从上到下分为五个核心层次:
测试执行层(Tests Layer) ← 面向测试用例
↑
业务逻辑层(Business Layer) ← 面向页面交互
↑
驱动管理层(Driver Layer) ← 面向设备控制
↑
配置数据层(Config Layer) ← 面向环境配置
↑
基础工具层(Base Layer) ← 面向基础设施
每一层都有明确的职责边界,上层依赖下层提供服务,下层不感知上层存在,确保高内聚、低耦合的设计原则。
测试执行层(Tests Layer)
1.目录结构
tests/
├── base_test.py
└── test_message.py
编写和组织测试用例,定义测试场景和验证逻辑。这是框架的最上层,直接面向测试工程师,提供清晰、易用的测试编写接口。
2.测试基类 (base_test.py)
定位:所有测试用例的父类
核心功能:
- 测试生命周期:setup/teardown方法封装
- 通用断言:自定义断言方法
- 数据准备:测试数据初始化
- 页面对象初始化:自动初始化所需页面对象
设计价值:统一测试用例的行为模式,减少重复代码,提供统一的测试环境准备和清理机制。
3. 测试用例 (test_*.py)
定位:具体的测试场景实现
设计原则:
- 单一职责:每个测试用例验证一个明确功能
- 清晰结构:Arrange-Act-Assert三段式
- 丰富描述:清晰的测试步骤说明
- 数据驱动:支持参数化测试
业务逻辑层(Business Layer)
1.目录结构
locators/
├── locators_android.py
└── locators_ios.py
page/
├── bottom_bar.py
├── contacts_page.py
├── discovery_page.py
├── message_page.py
└── wechat_page.py
base/
└── base_page.py
封装页面的业务逻辑和元素定位,实现Page Object Model设计模式。这一层是测试框架的核心,将UI元素和业务操作封装成可重用的组件。
2.元素定位器(Locators/)
定位:UI元素的坐标地图,实现元素定位与业务逻辑彻底分离,根据平台分类,数据多的时候也可以用一个平台一个文件夹,一个page类对应一个Locators类
文件结构:
- locators_android.py:Android平台元素定位字典
- locators_ios.py:iOS平台元素定位字典
设计优势:UI变更时只需修改定位器文件,业务代码零改动
存储格式:
class MessagePageLocators:
# ===================== 聊天页面 =====================
返回按钮= (AppiumBy.XPATH, "//*[@content-desc='返回']")
聊天对象名称= (AppiumBy.ID, "com.tencent.mm:id/obn")
聊天信息按钮= (AppiumBy.ID, "com.tencent.mm:id/fq")
消息列表容器= (AppiumBy.ID, "com.tencent.mm:id/bp0")
3.页面基类和对象 (BasePage,Page/)
BasePage
BasePage 基类是移动端自动化测试框架的核心基础组件,采用动态属性注入技术,实现了页面元素的智能化管理和统一操作封装。
作为所有页面对象的父类,它承担着智能转换中枢的关键角色——将静态配置的元素定位器动态转换为可直接操作的元素属性,同时提供平台识别、公共参数管理等基础能力。
通过平台感知机制,框架能够自动适配不同操作系统(Android/iOS)的交互差异,为后续的平台特异性操作扩展提供了灵活的技术基础,确保测试代码在跨平台场景下仍能保持高度的可维护性和可扩展性。
Page/
定位:业务操作的封装单元
设计理念:每个页面类对应一个实际界面,封装该页面的所有交互
部分页面:
wechat_page.py:微信主界面,导航切换、新消息检查
message_page.py:消息模块,发送消息、聊天管理
contacts_page.py:通讯录模块,添加好友、联系人管理
discovery_page.py:发现模块,朋友圈、小程序
bottom_bar.py:底部导航栏组件,标签切换
设计模式:
- 继承关系:所有页面继承自BasePage
- 链式调用:支持流畅的API调用
- 页面工厂:按需创建页面对象
- 状态管理:页面加载和状态验证
示例:
def send_message(self, message):
"""发送消息的完整业务流程"""
self.输入框.click()
self.输入框.send_keys(message)
self.发送按钮.click()
return self # 支持链式调用
驱动管理层(Driver Layer)
1.目录结构
core/
├── core_driver.py
└── driver_options.py
services/
└── appium_service.py
驱动管理层管理Appium驱动的生命周期和服务状态,对原生WebDriver进行二次封装,提供更丰富的操作方法和更稳定的执行环境。这一层负责与移动设备进行实际的交互。
2.Appium服务 (appium_service.py)
定位:Appium服务的进程管理器,实现自启动,无任务关闭等功能
核心功能:
- 服务启动:程序化启动Appium Server
- 服务监控:实时监控服务状态和日志
- 端口管理:自动分配可用端口,避免冲突
- 资源清理:测试结束后的服务停止
设计价值:实现测试环境的自包含和自清理,特别适合CI/CD流水线
3.驱动核心 (core_driver.py)
core_driver.py是对原生WebDriver 的高级增强封装,在完全兼容Appium 原生功能并保持底层驱动完整性的基础上,针对移动端特有的交互场景,系统性地封装了长按、滑动、缩放、拖拽等复杂手势操作。
它通过统一的手势参数格式、标准化的操作结果返回和一致的异常处理机制,实现了复杂手势的标准化调用。同时,内置的智能容错机制,包括操作重试策略、执行条件自动检测和状态验证,使得测试代码能够以更直观、更稳定的方式执行复杂的触控交互,显著提升了移动端自动化测试的可靠性和执行效率。
示例:长按操作实现
def long_press(self, duration: int = 1000,
x: Optional[int] = None,
y: Optional[int] = None) -> 'WebElement':
"""
长按元素(W3C Actions 实现)
Args:
duration: 长按持续时间(毫秒)
x: 元素内的x坐标
y: 元素内的y坐标
"""
if x is None or y is None:
center = self._get_element_center()
press_x = center['x']
press_y = center['y']
else:
location = self.location
press_x = location['x'] + x
press_y = location['y'] + y
# 使用 W3C Actions
actions = ActionChains(self._parent)
# 移动到位置 -> 按下 -> 暂停 -> 释放
actions.w3c_actions.pointer_action \\
.move_to_location(press_x, press_y) \\
.pointer_down() \\
.pause(duration / 1000) \\
.pointer_up()
actions.perform()
return self
业务层使用示例:
def long_press_message(self, message_text):
'''长按消息'''
self.消息.long_press()
self.删除按钮.click()
4.驱动配置 (driver_options.py)
driver_options.py是框架中的设备能力配置工厂,专门负责为不同设备和平台生成最优的Desired Capabilities。它通过智能化的平台适配机制,为 Android 和 iOS 生成差异化的基础配置。该模块确保了同一套测试代码能够无缝适配多样的测试设备与环境,为框架的跨平台兼容性与执行稳定性提供了核心的配置支撑。
配置数据层 (Config Layer)
1.目录结构
configs/
├── config.yml
└── data.yml
管理与代码分离的配置信息和测试数据,实现测试环境的灵活适配。这一层是框架的"控制心",所有可配置项都集中在此管理。
2.环境配置 (config.yml)
定位:框架运行的控制中心
核心配置组:
|
配置类别 |
核心参数 |
应用场景 |
|
设备管理 |
设备列表、平台、版本 |
多设备并发执行 |
|
应用配置 |
包名、启动参数、安装路径 |
应用安装和启动 |
|
执行策略 |
超时设置、重试次数 |
测试执行控制 |
设计理念:配置外部化,实现一次编写,多环境运行
3.测试数据 (data.yml)
定位:数据驱动的数据仓库
数据结构:
- 用户数据:账号、密码、用户角色
- 业务数据:消息内容、联系人信息、搜索关键词
- 验证数据:预期结果、断言条件、边界值
设计价值:实现测试逻辑与测试数据彻底分离,支持真正的数据驱动测试
基础工具层 (Base Layer)
1.目录结构
common/
├── config_loader.py
├── log_util.py
└── screenshot_util.py
基础工具层提供框架运行所需的基础设施和通用工具,是整个架构的基石。这一层提供最基础的、可复用的工具类,被所有上层模块依赖。
2.配置加载器(config_loader.py)
config_loader.py是框架中的配置加载中枢,负责统一管理和解析YAML 格式的配置文件(包括 config.yml和 data.yml)。作为整个框架的配置入口,config_loader.py实现了代码与配置的彻底解耦,为测试环境管理、数据驱动执行以及持续集成流水线提供了稳定可靠的配置支持。
3.日志工具(log_util.py)
定位:框架运行的诊断系统
核心功能:
- 分级日志(DEBUG/INFO/WARNING/ERROR)
- 多输出渠道(控制台、文件)
- 结构化日志格式
- 监控和时间记录
应用场景:记录测试执行全过程,便于问题追踪和分析
4.截图工具(screenshot_util.py)
定位:可视化证据采集器
核心功能:
- 失败自动截图
- 步骤关键点截图
- 截图与测试用例关联
提供不同目录支持,可为报告等输出截图
设计价值:为测试失败提供直观证据,加速问题排查
输出目录
logs/ # 执行日志,便于问题追踪
reports/ # 测试报告,可视化展示结果
screenshots/ # 失败截图,提供直观证据
设计理念:结构化存储测试产出,便于归档和分析
配置文件
conftest.py # Pytest Fixture定义
pytest.ini # Pytest运行配置
report_hooks.py # 报告增强钩子
requirements.txt # Python依赖包清单
run.py # 本地运行入口脚本
协同关系:配置Pytest运行环境,提供完整的本地开发和调试能力,并且结合Jenkins配置,设置相关参数。
层次间协作流程
正向执行流程
1. 基础层初始化 → 加载日志、截图工具
2. 配置层加载 → 读取config.yml和data.yml
3. 驱动层准备 → 启动Appium服务,初始化Driver
4. 业务层封装 → 加载页面对象和定位器
5. 测试层执行 → 加载数据,运行测试用例,执行业务操作
反向依赖关系
测试用例→ 依赖 → 页面对象 → 依赖 → 定位器
↓ ↓ ↓
依赖基类 ← 依赖 → 驱动管理 ← 依赖 → 配置加载
↓ ↓ ↓
工具集合 ← 协同 → 服务管理 ← 协同 → 数据管理
数据流向
config.yml → 配置加载器 → 驱动选项 → Appium驱动
data.yml → 数据加载器 → 测试用例 → 页面操作
页面操作 → 产生结果 → 生成报告 → 归档输出
异常情况 → 触发截图 → 记录日志 → 错误分析
四、Jenkins配置和效果展示
Jenkins配置
Jenkins进行配置,形成流水线操作,可自动执行生成结果,将结果整理输出形成:

XML报告

HTML报告
报告包含:应用信息,环境信息,测试结果统计,执行用例信息,失败或重跑信息,失败截图(有需要的话也可以每次运行后截图)

