当前位置: 首页 > article >正文

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

前言

        我发现每天还是陆陆续续有人在看我之前写的自动化框架搭建的文档;即使很早就有新的框架,更好的选择出来了;所以特别写了这一篇目前大厂也在使用的;日活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 响应状态码应该是200And 响应应该包含用户列表

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 anystages {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的全方位自动化测试解决方案,显著提高软件质量和发布速度。

相关文章:

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

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

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

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约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…...

陕化之光(原创)

当城市在和周公化合 陕化的工装已与朝霞发生反应 工人先锋号已然吹响 陕化工人游走在工作的床层 钢铁森林间穿梭的身影 是沉默的催化剂 让冰冷的方程式 绽放出最活跃的分子温度 扳手与阀门对话时 塔林正在记录 关于电流与压力的学习笔记 每一次精确的调控 都是舞台上…...

redis 内存中放哪些数据?

在 Java 开发中,Redis 作为高性能内存数据库,通常用于存储高频访问、低延迟要求、短期有效或需要原子操作的数据。以下是 Redis 内存中常见的数据类型及对应的使用场景,适合面试回答: 1. 缓存数据(高频访问,降低数据库压力) 用户会话(Session):存储用户登录状态、临时…...

【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...

git合并分支原理

Git合并的原理是基于三方合并(three-way merge)算法,它通过比较三个快照来合并不同分支上的更改。这三个快照包括两个要合并的分支的最新提交和它们的共同祖先提交。合并过程并不是简单地按照提交时间来进行,而是通过比较这些快照…...

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.程序设计内容...

编程语言到mysql ‘\‘到数量关系

在 MySQL 的模糊查询中,反斜杠 \ 的转义规则需要根据 转义层级 和 SQL 模式 来确定。以下是详细说明及示例: 一、默认模式下(未启用 NO_BACKSLASH_ESCAPES) 1. 规则说明 反斜杠转义:\ 是 MySQL 的默认转义字符。 转义…...

【ROS】move_base 导航节点概述

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

【教程】Ubuntu修改ulimit -l为unlimited

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 问题描述 解决方法一 解决方法二 解决方法三 (终极) 问题描述 查系统资源限制 ulimit -l如果返回的是 64 或其他较小值,那么RDM…...

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

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

【四川省第三届青少年C++算法设计大赛 (小低组) 第 一试】

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项) 1、计算机中负责执行算术和逻辑运算的部件是() A. 内存 B.CPU C.硬盘 D.鼠标 2、近期备受关注的国产开源生成式人工智能大模型是() A. AlphaChat B. OpenPilot …...

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;结合电子围栏实现设…...

深入解析C++引用:安全高效的别名机制及其与指针的对比

一、引用的核心概念 1.1 引用定义 引用&#xff08;Reference&#xff09;是C为变量创建的别名&#xff0c;通过&符号声明。其核心特性&#xff1a; 指针适用场景&#xff1a; 现代C黄金法则&#xff1a; "引用是指针的安全马甲&#xff0c;而智能指针是带着安全帽的…...

分词与倒排索引的原理:深入解析与 Java 实践

在信息检索领域&#xff0c;如搜索引擎和全文检索系统&#xff0c;分词&#xff08;Tokenization&#xff09;和倒排索引&#xff08;Inverted Index&#xff09;是核心技术。分词将文本拆分为语义单元&#xff0c;为索引构建提供基础&#xff1b;倒排索引则高效映射词项到文档…...

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;不需要用户点击登录/注册按钮&#…...

如何提高webrtc操作跟手时间,降低延迟

第一次做webrtc项目&#xff0c;操作延迟&#xff0c;一直是个问题&#xff0c;多次调试都不能达到理想效果。偶尔发现提高jitterBuffer时间可以解决此问题。关键代码 const _setJitter (values: number) > { const receives peerConnection.getReceivers();receives.f…...

Promise链式调用、async和await

目录 回调函数地狱与Promise链式调用 一、回调函数地狱 1. 典型场景示例 2. 回调地狱的问题 二、Promise链式调用 1. 链式调用解决回调地狱 2. 链式调用的核心规则 三、链式调用深度解析 1. 链式调用本质 2. 错误处理机制 四、回调地狱 vs 链式调用 五、高级链式技…...