欢迎光临
我们一直在努力

基于Appium的企业级移动自动化测试框架

一、框架核心价值 

跨平台· 自动化 · 可扩展 · 易维护

  • 支持 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报告

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

      图片

      赞(0)
      未经允许不得转载:171主机测评 » 基于Appium的企业级移动自动化测试框架
      分享到: 更多 (0)

      评论 抢沙发

      • 昵称 (必填)
      • 邮箱 (必填)
      • 网址