现代测试自动化框架教程: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的全方位自动化测试解决方案,显著提高软件质量和发布速度。

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

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

相关文章

.NET Core DI(依赖注入)的生命周期及应用场景

在.NET中,依赖注入(DI,Dependency Injection)是一种设计模式,它通过将依赖关系注入到类中,而不是让类自己创建依赖项,来降低类之间的耦合度。这使得代码更加模块化、灵活和易于测试。在.NET中&a…

设计模式 --- 观察者模式

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 优点: ​​1.解耦性强​​: ​​观察者(订阅者)与主…

PasteForm框架开发之Entity多级嵌套的表单的实现

你相信么,使用PasteForm框架开发,管理端居然不要写代码!!! 一起来看看PasteForm是否支持多级表模式(外表) 需求假设 假如有这么一个需求,就是订单表,包含了多级的信息,比如这个订单包含了哪些…

深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告

标题:深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告 摘要: 在机器学习中,评估分类模型的性能是至关重要的一步。本文详细介绍了四个核心评估指标:ROC曲线、AUC值、F1分数和分类报告。通过对比这些指标…

多模态医学AI框架Pathomic Fusion,整合了组织病理学与基因组的特征

小罗碎碎念 在医学AI领域,癌症的精准诊断与预后预测一直是关键研究方向。 这篇文章提出了Pathomic Fusion这一创新框架,致力于解决现有方法的局限。 传统上,癌症诊断依赖组织学与基因组数据,但组织学分析主观易变,基因…

《Python星球日记》第27天:Seaborn 可视化

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、Seabor…

【scikit-learn基础】--『监督学习』之 决策树回归

决策树算法是一种既可以用于分类,也可以用于回归的算法。 决策树回归是通过对输入特征的不断划分来建立一棵决策树,每一步划分都基于当前数据集的最优划分特征。 它的目标是最小化总体误差或最大化预测精度,其构建通常采用自上而下的贪心搜索…

解决安卓开发“No Android devices detected.”问题

解决安卓开发“No Android devices detected.”问题 ​ 当我们插入移动设备的USB时,却发现这并未显示已连接到的设备 点击右侧的Assistant,根据提示打开移动设备开发者模式并启用USB调试模式,然后发现我们未连接到移动设备的原因是ABD服务的原因 问题确定了&…

idea如何使用git

在 IntelliJ IDEA 中使用 Git 的详细步骤如下,分为配置、基础操作和高级功能,适合新手快速上手: ​一、配置 Git​ ​安装 Git​ 下载并安装 Git,安装时勾选“Add to PATH”。验证安装:终端输入 git --version 显示版本…

软件架构设计:MVC、MVP、MVVM、RIA 四大风格优劣剖析

MVC、MVP、MVVM 和 RIA 都是软件架构中常见的设计风格,以下是对它们的详细介绍: 一、MVC 架构风格(Model - View - Controller) 1.简介:MVC 架构风格将软件应用程序分为三个核心部分,通过这种划分来分离不…

Centos/RedHat 7.x服务器挂载ISCSI存储示例(无多路径非LVM)

客户让帮忙挂载个ISCSI存储,大概结构如下图所示: ISCSI存储为一台安装了truenas的X86服务器,提供存储服务的IP地址为10.16.0.1 服务器的ETH1网卡配置与10.16.0.1同段网络。 为了给客户做个简单培训,整理了一下操作步骤。下面是配…

TV板卡维修技术【二】

【一】测量未知MOS引脚定义的好坏 TO-252封装的MOS管子,上面的大焊盘是D极,下面的3个不同品牌的NMOS或者PMOS验证了这个结论: 利用这个特性,可以在不知道MOS引脚定义的情况下测量出MOS的好坏,如下图: 插件…

基于 cefpython 实现嵌入 Chromium (CEF)

CEF Python是一个开源项目,旨在为Chromium Embedded Framework提供Python绑定,许多流行的GUI工具包都提供了嵌入CEF浏览器,例如QT。 安装 pip install cefpython366.1支持的Python版本: 实现打开网页 from cefpython3 import…

MySQL-存储引擎和索引

1.MySQL的基础架构是什么? MySQL由连接器、分析器、优化器、执行器和存储引擎这五部分构成。 一条SQL的执行流程: 通过连接器连接数据库,检查用户名和密码,以及权限校验,是否有增删改查的权限。在MySQL8.0之前&#…

安卓性能调优之-掉帧测试

掉帧指的是某一帧没有在规定时间内完成渲染,导致 UI 画面不流畅,产生视觉上的卡顿、跳帧现象。 Android目标帧率: 一般情况下,Android设备的屏幕刷新率是60Hz,即每秒需要渲染60帧(Frame Per Second, FPS&a…

【运维自动化-标准运维】职能化功能如何使用?

职能化功能主要用于一些固化的标准流程可以通过权限开放的方式给到那些负责固定职能的非运维人员,比如外包操作员来执行操作,如此可以释放一些运维的人力,让其可以专注流程的建设和优化。实操演示 新建职能化流程(运维角色操作&a…

游戏引擎学习第224天

回顾游戏运行并指出一个明显的图像问题。 回顾一下之前那个算法 我们今天要做一点预加载的处理。上周刚完成了游戏序章部分的所有剪辑内容。在运行这一部分时,如果观察得足够仔细,就会注意到一个问题。虽然因为视频流压缩质量较低,很难清楚…

【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期

🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…

OpenAI 最新发布的 GPT-4.1 系列在 API 中正式上线

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【力扣】day1

文章目录 27.移除元素26. 删除有序数组的重复项 27.移除元素 26. 删除有序数组的重复项 我们仔细看一下这两道题的最后的返回值,为什么第一题返回slow 而第二题返回slow1 最后的返回值该如何返回绝对不是凭感觉,我们自己分析一下第一个slow,从0位置开始, 遇到val值就开始和fas…