现代测试自动化框架教程:Behave接口测试与Airtest移动端UI自动化

news2025/4/16 6:05:30

前言

        我发现每天还是陆陆续续有人在看我之前写的自动化框架搭建的文档;即使很早就有新的框架,更好的选择出来了;所以特别写了这一篇目前大厂也在使用的;日活400w有实际落地的自动化测试架构方案;        

        随着测试技术的发展,传统的pytest+selenium框架已经不能满足当今多样化的测试需求。本教程将介绍两种现代测试框架:Behave(用于接口自动化测试)和Airtest(用于移动端UI自动化测试),特别针对新手设计,从环境搭建到实际应用全面讲解。

一、Behave框架入门:行为驱动开发(BDD)接口测试

1.1 Behave框架简介

Behave是一个基于Python的行为驱动开发(BDD)工具,它使用自然语言描述测试场景,使非技术人员也能理解测试用例1。与传统的pytest不同,Behave特别适合接口自动化测试,因为它:

  • 使用Gherkin语言编写测试用例(Feature、Scenario、Given-When-Then)

  • 支持清晰的测试报告和文档生成

  • 易于与非技术团队成员协作

  • 提供丰富的钩子函数(before/after场景、步骤等)

1.2 环境搭建

首先确保已安装Python(建议3.7+),然后安装Behave:

pip install behave
pip install requests  # 用于HTTP请求
pip install allure-behave  # 可选,用于生成漂亮报告

1.3 项目结构

一个标准的Behave项目结构如下5:

features/
│
├── api.feature            # 特性文件,用自然语言描述测试
├── environment.py         # 环境配置和钩子函数
└── steps/
    └── api_steps.py       # 步骤实现代码

1.4 编写第一个接口测试

1. 创建特性文件(features/api.feature)

Feature: 用户API测试
  作为系统管理员
  我需要验证用户API的功能
  以确保系统正常运行

  Scenario: 获取用户列表
    Given 准备请求头
    When 发送GET请求到"https://api.example.com/users"
    Then 响应状态码应该是200
    And 响应应该包含用户列表

2. 实现步骤定义(steps/api_steps.py)

from behave import given, when, then
import requests

@given('准备请求头')
def step_impl(context):
    context.headers = {'Content-Type': 'application/json'}

@when('发送GET请求到"{url}"')
def step_impl(context, url):
    context.response = requests.get(url, headers=context.headers)

@then('响应状态码应该是{status_code}')
def step_impl(context, status_code):
    assert context.response.status_code == int(status_code)

@then('响应应该包含用户列表')
def step_impl(context):
    assert 'users' in context.response.json()

3. 运行测试

behave features/api.feature

1.5 高级功能:环境控制和报告生成

environment.py中可以添加钩子函数控制测试环境5:

def before_all(context):
    # 在所有测试之前运行
    context.base_url = "https://api.example.com"
    
def after_step(context, step):
    # 在每个步骤之后运行
    if step.status == "failed":
        print(f"步骤失败: {step.name}")

要生成Allure报告:

behave -f allure_behave.formatter:AllureFormatter -o report/ features/
allure serve report/

1.6 实际应用示例:测试RESTful API

结合Requests库,可以轻松测试各种HTTP方法610:

# steps/api_steps.py
@when('以{username}和{password}登录')
def step_impl(context, username, password):
    data = {'username': username, 'password': password}
    context.response = requests.post(
        f"{context.base_url}/login",
        json=data,
        headers=context.headers
    )

二、Airtest框架:移动端UI自动化测试

2.1 Airtest框架简介

Airtest是由网易开发的UI自动化测试框架,特别适合移动端(Android/iOS)测试,具有以下特点:

  • 基于图像识别的元素定位,不依赖具体UI代码

  • 支持Poco框架进行UI层次结构定位

  • 内置IDE方便脚本录制和调试

  • 支持跨平台(Windows、Mac、Linux)

2.2 环境搭建

安装Airtest IDE和Python库:

pip install airtest
pip install pocoui  # Poco框架

下载Airtest IDE:官方下载地址

2.3 项目结构

典型的Airtest项目结构:

mobile_tests/
│
├── cases/
│   ├── login.air      # Airtest测试脚本
│   └── search.air
├── reports/          # 测试报告
└── utils/            # 公共方法

2.4 编写第一个移动端测试

1. 连接设备

在Airtest IDE中连接Android/iOS设备或模拟器。对于Android,确保已启用USB调试模式。

2. 录制测试脚本

使用Airtest IDE的录制功能创建login.air脚本:

from airtest.core.api import *
from poco.drivers.android.uiautomation import AndroidUiautomationPoco

# 初始化Poco
poco = AndroidUiautomationPoco()

# 启动应用
start_app("com.example.app")

# 输入用户名和密码
poco("com.example.app:id/username").set_text("testuser")
poco("com.example.app:id/password").set_text("password123")

# 点击登录按钮
poco("com.example.app:id/login_btn").click()

# 验证登录成功
assert_exists(Template(r"tpl/home_screen.png"))

3. 运行测试

airtest run login.air --device Android:///

2.5 高级功能:路由跳转与图像识别

当应用支持路由跳转时,测试可以大大简化:

# 直接通过路由跳转到目标页面
poco("com.example.app:id/nav_button").click()
wait(Template(r"tpl/target_page.png"))

# 或者使用路由URL
start_app("com.example.app://user/profile")

图像识别是Airtest的核心功能:

# 等待某个图片出现
touch(Template(r"tpl/button.png"))

# 或者
if exists(Template(r"tpl/popup.png")):
    touch(Template(r"tpl/close_btn.png"))

2.6 生成测试报告

Airtest自动生成HTML报告,也可以与Allure集成:

airtest report login.air --log_root ./logs --export ./report

三、Behave与Airtest结合的最佳实践

3.1 混合框架架构

结合两种框架的优势,可以构建强大的测试体系:

tests/
│
├── api/               # 接口测试
│   ├── features/
│   └── steps/
│
├── mobile/            # 移动端测试
│   ├── cases/
│   └── reports/
│
└── shared/            # 共享代码
    ├── utils/
    └── config.py

3.2 共享测试数据

通过环境变量或配置文件共享测试数据:

# shared/config.py
TEST_USER = {
    'username': 'testuser',
    'password': 'password123'
}

3.3 持续集成配置

Jenkins CI配置示例:

pipeline {
    agent any
    
    stages {
        stage('API Tests') {
            steps {
                sh 'behave ./tests/api/features --junit'
            }
        }
        
        stage('Mobile Tests') {
            steps {
                sh 'airtest run ./tests/mobile/cases/login.air --device Android:///'
            }
        }
    }
    
    post {
        always {
            allure includeProperties: false, jdk: '', results: [[path: 'tests/api/reports']]
            archiveArtifacts artifacts: 'tests/mobile/reports/**'
        }
    }
}

四、常见问题与解决方案

4.1 Behave常见问题

Q: 步骤定义找不到?
A: 确保步骤文件在steps/目录下,且文件名以_steps.py结尾5

Q: 如何传递数据between步骤?
A: 使用context对象,如context.user_id = response.json()['id']

4.2 Airtest常见问题

Q: 无法识别元素?
A: 尝试:

  1. 使用Poco Inspector确认元素路径

  2. 增加等待时间poco(text="Login").wait(10).click()

  3. 使用图像识别作为后备

Q: 测试在不同设备上不稳定?
A: 使用相对定位或更宽松的图像匹配阈值:

Template(r"tpl/button.png", threshold=0.7)

五、总结与进阶学习

本教程介绍了现代测试自动化中的两个强大框架:

  • Behave:用于清晰、可维护的接口自动化测试

  • Airtest:用于高效的移动端UI自动化测试

进阶学习资源

  1. Behave官方文档

  2. Airtest官方文档

  3. Poco框架GitHub

实际项目建议

  1. 从简单场景开始,逐步增加复杂度

  2. 建立良好的测试数据管理策略

  3. 将自动化测试集成到CI/CD流程中

  4. 定期维护和更新测试用例

        通过结合这两种框架,你可以构建覆盖接口和UI的全方位自动化测试解决方案,显著提高软件质量和发布速度。

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

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

相关文章

优化运营、降低成本、提高服务质量的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…

使用Lombok的@Slf4j和idea构建:找不到log符号-解决

问题:在使用Lombok的Slf4j构建项目时提示如下内容: MvcConfiguration.java:26:9 java: cannot find symbol symbol: variable log location: class cn.edu.wynu.mrcinerec.mrserver.config.WebMvcConfiguration查了网上的方法都是改配置 但是使用Googl…

【Python爬虫】简单案例介绍1

目录 三、Python爬虫的简单案例 3.1 网页分析 单页 三、Python爬虫的简单案例 本节以科普中国网站为例。 3.1 网页分析 单页 在运用 Python 进行爬虫开发时,一套严谨且有序的流程是确保数据获取高效、准确的关键。首先,深入分析单个页面的页面结构…

LLM-as-Judge真的更偏好AI输出?

论文标题 Do LLM Evaluators Prefer Themselves for a Reason? 论文地址 https://arxiv.org/pdf/2504.03846 代码地址 https://github.com/wlchen0206/llm-sp 作者背景 弗吉尼亚大学,乔治华盛顿大学 实践建议 在将LLM部署为评估器之前,应严格评…

【软考-架构】13.3、架构复用-DSSA-ABSD

✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 1、软件架构复用2、特定领域软件架构DSSADSSA的三个基本活动参与DSSA的四种角色人员建立DSSA的过程三层次模型 考试真题第一题第二题 3、基于架构的软件开发ABSD的软件开发…

色温插值计算借鉴

色温插值计算方法借鉴: 摘至:Understanding the in-camera rendering pipeline & the role of AI and deep learning

SnailJob:分布式环境设计的任务调度与重试平台!

背景 近日挖掘到一款名为“SnailJob”的分布式重试开源项目,它旨在解决微服务架构中常见的重试问题。在微服务大行其道的今天,我们经常需要对某个数据请求进行多次尝试。然而,当遇到网络不稳定、外部服务更新或下游服务负载过高等情况时,请求…

网络安全-Http\Https协议和Bp抓包

1. http协议,有请求必有相应, 请求协议, 响应协议; 2. 密码学加密机制及常用算法和常用名称说明: 算法 密钥 明文数据 密文; 加密算法分类和常用算法: 加密算法可以归结为三大类&#xff…

爱普生FC1610AN5G手机中替代传统晶振的理想之选

在 5G 技术引领的通信新时代,手机性能面临前所未有的挑战与机遇。从高速数据传输到多任务高效处理,从长时间续航到紧凑轻薄设计,每一项提升都离不开内部精密组件的协同优化。晶振,作为为手机各系统提供稳定时钟信号的关键元件&…

质粒已被全面解析

随着微生物研究的不断深入和耐药性问题的日益加剧,了解质粒对开发抗菌策略及生物技术应用意义重大。但现有质粒数据库缺乏细致注释并且工具存在不足。近期,香港城市大学李帅成课题组在Nucleic Acids Research期刊发表研究成果,推出全面注释质…

实验二.单按键控制LED

1.实验任务 如图4.1所示:在P0.0端口上接一个发光二极管L1,按键按一下灯亮,在按一下灯灭。 2.电路原理图 3.系统板上硬件连线 把“单片机系统”区域中的P0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容

【ROS】move_base 导航节点概述

【ROS】move_base 导航节点概述 前言move_base 架构move_base 内部模块move_base 外部数据 前言 本章介绍 ROS 导航系统中的核心节点 move_base,它负责路径规划和导航控制,是系统的调度中心。我们将简要讲解其内部模块结构,以及运行所需的外…

【FPGA基础学习】DDS信号发生器设计

一、IP核简介 IP核的定义与核心作用 定义 IP核是芯片设计中独立功能的成熟模块,例如处理器、存储器、接口协议等。它们以硬件描述语言(HDL)、网表或物理版图形式交付,供其他设计者直接调用,避免重复开发 核心作用 缩…

linux ceres库编译注意事项及测试demo

最近linux编译了ceres库,因为要涉及到一个程序源代码的编译,但是反复测试,一直各种错误,所以一个个问题排除; 虽然前面ceres库编译成功了,但是版本自定义扔进去的,所以在进行代码编译的时候各种报错。 参考…

Flux.1+ComfyUI组合实战!本地部署生成高质量AI图片全流程指南

文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在这个AI技术风起云涌的时代,图像生成模型已经从科幻变成了现实中的‘印钞机…

css hover 实现鼠标放上去后略微放大的效果

代码如下&#xff1a; <div class"button">文字</div>css代码如下&#xff1a; .button{width: 100px;height: 50px;margin-top: 100px;margin-left: 100px;color: white;background-color: gray;line-height: 50px;text-align: center;transition: all…

UWB定位技术目前主要应用在哪些行业(更新2025)

UWB定位技术的主要行业应用 ‌一、工业制造领域‌ ‌人员与设备定位‌&#xff1a;通过厘米级精度追踪工人、叉车及设备位置&#xff0c;优化生产流程并提升安全管理效率&#xff08;如高危区域实时报警&#xff09;‌。‌防撞预警与工时统计‌&#xff1a;结合电子围栏实现设…

vscode格式化为什么失效?自动保存和格式化(Prettier - Code formatter,vue-format)

vscode自动格式化保存最终配置 博主找了好多的插件&#xff0c;也跟着教程配置了很多&#xff0c;结果还是没有办法格式化&#xff0c;最终发现了一个隐藏的小齿轮&#xff0c;配置完后就生效了 关键步骤 关键配置 一定要点小齿轮&#xff01;&#xff01;&#xff01; 这个小…

鸿蒙应用元服务开发-Account Kit配置登录权限

一、场景介绍 华为账号登录是基于OAuth 2.0协议标准和OpenID Connect协议标准构建的OAuth2.0 授权登录系统&#xff0c;元服务可以方便地获取华为账号用户的身份标识&#xff0c;快速建立元服务内的用户体系。 用户打开元服务时&#xff0c;不需要用户点击登录/注册按钮&#…

React ROUTER之嵌套路由

第一张是需要修改router文件createBrowserRouterd参数数组中的路由关系 第二张是需要在一级路由的index.js中选择二级路由的位置 第一步是在全局的router.js文件中加入新的children属性&#xff0c;如图 第二步是在一级路由的index.js文件中声明outLet组件 默认二级路由 在…