0-1搭建app 自动化测试框架

以下是搭建一个高效、可维护的 APP 自动化测试框架 的完整流程,涵盖工具选择、架构设计、代码实现和实践:

一、明确需求和选型

1. 需求分析

  • 支持平台:Android、iOS 或跨平台?
  • 测试类型:功能测试、性能测试、兼容性测试?
  • 集成目标:CI/CD 流水线、测试报告、云测试平台?

2. 工具选型

自动化驱动

Appium(主流跨平台)

控制设备、执行操作

编程语言

Python(易上手)、Java(企业级)

编写测试逻辑

测试框架

Pytest(Python)、TestNG/JUnit(Java)

管理用例、断言、测试报告

元素定位工具

Appium Inspector、Android Studio Layout Inspector

获取控件属性

依赖管理

Maven(Java)、pip(Python)

管理库版本

持续集成

Jenkins、GitHub Actions、CircleCI

自动化触发测试

云测试平台

Sauce Labs、BrowserStack、AWS Device Farm

多设备并行测试

二、框架架构设计

分层设计(推荐 Page Object Model)

├── config/               # 配置文件(设备信息、环境变量)
├── pages/                # 页面对象模型(封装页面元素和操作)
├── testcases/            # 测试用例(调用 Page 类实现业务逻辑)
├── utils/                # 工具类(设备管理、日志、报告生成)
├── reports/              # 测试报告(HTML/Allure 报告)
└── conftest.py           # Pytest 全局配置(初始化/清理)

三、环境搭建步骤

1. 安装基础依赖

  • Python/Java 环境
  • Appium Servernpm install -g appium
  • Android SDKXcode(iOS)
  • 驱动工具appium driver install uiautomator2(Android)

2. 初始化项目

# Python 示例
mkdir app-automation && cd app-automation
pip install appium-python-client pytest allure-pytest

四、核心代码实现

1. 配置文件(config/config.yaml

android:
  platformName: Android
  platformVersion: 13
  deviceName: Pixel_6
  app: ./apps/demo.apk
  automationName: UiAutomator2

ios:
  platformName: iOS
  platformVersion: 16.4
  deviceName: iPhone 14
  app: ./apps/demo.ipa
  automationName: XCUITest

2. 设备管理工具类(utils/driver_manager.py

from appium import webdriver
import yaml

def get_driver(platform="android"):
    with open("config/config.yaml") as f:
        caps = yaml.safe_load(f)[platform]
    driver = webdriver.Remote('http://localhost:4723/wd/hub', caps)
    return driver

3. 页面对象模型(pages/login_page.py

from appium.webdriver.common.appiumby import AppiumBy

class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    def enter_username(self, username):
        self.driver.find_element(AppiumBy.ID, "com.app:id/username").send_keys(username)
    
    def enter_password(self, password):
        self.driver.find_element(AppiumBy.ID, "com.app:id/password").send_keys(password)
    
    def click_login(self):
        self.driver.find_element(AppiumBy.ID, "com.app:id/login_btn").click()

4. 测试用例(testcases/test_login.py

import pytest
from utils.driver_manager import get_driver
from pages.login_page import LoginPage

@pytest.fixture(scope="function")
def driver():
    driver = get_driver()
    yield driver
    driver.quit()

def test_login_success(driver):
    login_page = LoginPage(driver)
    login_page.enter_username("testuser")
    login_page.enter_password("password123")
    login_page.click_login()
    assert driver.find_element(AppiumBy.ID, "com.app:id/welcome_text").is_displayed()

五、增强功能集成

1. 测试报告(Allure 报告)

# 运行测试并生成报告
pytest --alluredir=./reports
allure serve ./reports

2. 异常处理与日志

# 在工具类中添加日志记录
import logging
logging.basicConfig(filename='logs/test.log', level=logging.INFO)

def get_driver(platform="android"):
    try:
        # 初始化代码
        logging.info("Driver initialized successfully")
    except Exception as e:
        logging.error(f"Driver initialization failed: {str(e)}")

3. 多设备并行测试

使用 Selenium GridAppium 插件(如 appium-grid):

# 启动多个 Appium 节点
appium --port 4723 --nodeconfig android-node.json
appium --port 4724 --nodeconfig ios-node.json

六、持续集成(CI/CD)

GitHub Actions 示例(.github/workflows/test.yml

name: Appium Tests

on: [push]

jobs:
  test:
    runs-on: macos-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          npm install -g appium
          appium driver install uiautomator2

      - name: Start Appium Server
        run: appium --port 4723 --log-level info &

      - name: Run Tests
        run: pytest -v --alluredir=./reports

      - name: Upload Allure Report
        uses: actions/upload-artifact@v3
        with:
          name: allure-report
          path: ./reports

七、最佳实践

  1. 元素定位策略: 优先使用 resource-id(Android)和 accessibilityId(iOS)。避免绝对 XPath,使用相对路径或 CSS 选择器。
  2. 数据驱动测试: 使用 @pytest.mark.parametrize 或外部 CSV/Excel 管理测试数据。
  3. 失败重试机制
  4. 云测试集成

八、常见问题解决

  1. 元素无法定位: 使用 driver.page_source 检查实时页面结构。添加隐式等待:driver.implicitly_wait(10)。
  2. 跨平台兼容性: 使用条件判断区分平台:
  3. 性能优化: 复用 Session:避免频繁启动/关闭 App。并行化测试:使用 pytest-xdist 插件。

按照以上步骤,你可以搭建一个 模块化、易维护、支持持续集成 的自动化测试框架。根据项目需求调整工具链和架构设计,例如加入性能监控(如 Appium Performance Plugin)或安全测试工具(如 MobSF)。

进阶高级测试工程师 文章被收录于专栏

《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart

全部评论

相关推荐

点赞 评论 收藏
分享
被加薪的哈里很优秀:应该继续招人,不会给你留岗位的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务