pytest测试框架之基本用法
一.基本用法
测试框架做了什么:
1.测试发现(收集用例,从不同目录/文件/类中找到用例)
2.环境管理(数据库的测试-数据库的密码;对应的库测试数据)
3.执行用例(收集用例执行的信息-日志/输入输出/失败的原因)
4.输出报告(执行的环境、用例的结果、用例执行的过程中产生的信息)
a. 测试发现
1.创建:test_开头的文件
2.文件中创建Test开头的类
3.创建test_开头的函数或方法(用例)
def test_a():#函数passclass Test:def test_b(self): #方法pass
①.pytest中以每一个函数或方法,做为用例
②.pytest以命名区分普通函数(方法)、用例
③.pytest启动方式 pytest
④.pytest输出用例的收集情况、执行情况、汇总信息
b.断言
python提供的内容判断机制,如果判断失败,抛出异常
name = "aa"# if name == "aa": # print("yes") # else: # print("no")assert name == "aa"
对于测试框架来说:
没有异常,判定为通过
存在异常,判定为失败
def test_a():#函数assert 1 == 1 #不会引发异常class Test:def test_b(self): #方法assert 1 == 2 #测试失败,引发异常
c.读懂结果 (对结果的判断)
test_xxx.py .F [100%]
在test_文件中执行2个用例,直至全部用例执行完毕
第一个通过,第二个失败
用例的执行情况
缩写 | 单词 | 含义 |
. | passed | 通过 |
F | failed | 失败(用例执行时报错) |
E | error | 出错(fixture执行报错) |
s | skipped | 跳过 |
X | xpassed | 预期外的通过 |
x | xfailed | 预期内的失败 |
二、高级用法
a. mark 标记
标记是为了用例之间彼此不同,实现用例筛选。
标记的使用步骤:
1.注册标记
准备配置文件-项目根目录下创建,"python.ini"
[pytest] #ini文件格式的语法,一个选择器markers = apiuiute2e
2.使用标记
①贴上标记
import pytest@pytest.mark.api #装饰器def test_a():#函数assert 1 == 1 #不会引发异常class Test:def test_b(self): #方法assert 1 == 2 #测试失败,引发异常
②筛选标记
pytest -m api #仅筛选api的用例 (执行程序时输入)
pytest -m e2e #筛选单个标记
一个用例可以打上不同标记,筛选标记是亦可筛选多个 pytest -m “api or e2e”
除了自己注册到的标记之外,pytest还内置了一些标记:跳过、预期失败、参数化、调用fixture第三方插件,也会内置一些标记:执行顺序、执行依赖、失败重试
b. fixture 框架
自动的在用例之前、之后完成,用于测试环境的构建和销毁。
标记也可以调用fixture。
@pytest.mark.usefixtures('aaa')
使用生成器实现前置、后置的分离。
@pytest.fixture() #fixture 不能在用例之间之间调用,名字放置函数/用例的参数中,称为请求 def aaa(): #python 语言上的生成器print("aaa") #前置代码,在用例执行之前自动运行yieldprint("111") #后置代码,在用例执行之后自动运行def test_a():#函数assert 1 == 1 #不会引发异常class Test:def test_b(self): #方法assert 1 == 2 #测试失败,引发异常
1.fixture的作用范围:支持5级范围 (unitest仅支持3级范围)
2.同一范围内的用例,共享fixture (fixture可以调用另一个fixture(作用范围影响共享))
3.conftest.py 创建全局范围fixture
c. hook (我们和框架之间的桥梁)
钩子:当pytest在合适的时机,允许进入、退出pytest核心内部。
目的 : 改变pytest原有的运行模式/处理方式
yaml文件: test_name:abc #测试用例名称 steps: #测试用例步骤- a:6b:2c:8 # a +b = c 成功- a:3b:3c:9 # a +b != c 失败
def pytest_yaml_run_step(item): #在合适的时机被pytest自动的调用step = item.current_stepprint("yaml中用例步骤",step)a = step['a']b = step['b']c = step['c']assert a+b == c
三、框架封装
封装:通过隐藏细节的方式降低使用的复杂度,添加新的功能特性。
pytest是通用型的测试框架:白盒、集成、黑盒(api/web/app)...
在pytest基础上,结合业务需求上封装:
1.接口自动化测试框架
2.Web自动化测试框架
3.App自动化测试框架
a.日志记录
修改配置文件
[pytest] //ini文件格式的语法,一个选择器markers =apiuiute2erun_yaml_case = 1log_file = ./pytest.log #建议通过不同的文件夹管理 ./log/pytest.log log_file_level = info log_file_format = %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s log_file_date_format = %Y-%m-%d %H:%H:%S#记录用例执行结果 result_log_enable =1 #记录用例分裂线 result_log_separator =1 #分割线等级 result_log_level_separator = warning #异常信息等级 result_log_level_verbose = info
b.生成测试报告
①修改配置文件
[pytest] //ini文件格式的语法,一个选择器addopts = --alluredir=./temps --clean-alluredir #生成数据markers =apiuiute2erun_yaml_case = 1log_file = ./pytest.log log_file_level = info log_file_format = %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s log_file_date_format = %Y-%m-%d %H:%H:%S#记录用例执行结果 result_log_enable =1 #记录用例分裂线 result_log_separator =1 #分割线等级 result_log_level_separator = warning #异常信息等级 result_log_level_verbose = info
②执行系统命令
allure generate -o report temps
③创建一键式执行脚本
使用python代码,代替命令
import os import pytest pytest.main() #启动框架 os.system('allure generate -o report temps') #生成报告
④接口请求和断言 (接口自动化框架)
pytest+yaml+requests+allure_logging 接口自动化测试框架
yaml文件:
test_name:百度首页接口 steps:-request: #请求接口method: geturl: https://www.baidu.com-response: #断言响应status_code: 200text: "baidu"
test_pytest.py:
import pytest import requests #请求接口 import responses_validator #断言响应@pytest.mark.api #装饰器@pytest.fixture() #fixture 不能在用例之间之间调用,名字放置函数/用例的参数中,称为请求 def aaa(): #python 语言上的生成器print("aaa") #前置代码,在用例执行之前自动运行yieldprint("111") #后置代码,在用例执行之后自动运行def pytest_yaml_run_step(item): #在合适的时机被pytest自动的调用step = item.current_stepkey = list(step)[0] value = list(step.values())[0]match key:case 'request':item.resp = requests.request(**value)case 'respones':responses_validator.validator(item.resp, **value)return True
⑤浏览器启动和控制 (web自动化框架)
pytest + yaml + selenium + allure + logging Web自动化测试框架
⑥app启动和控制(app自动化框架)
pytest + yaml + appium + allure + logging Web自动化测试框架
四、资源分享
a.接口/api
1.框架整体结构
2.框架使用说明
环境准备:
- 安装依赖:
pip install -r requirements.txt
- 安装 Allure 报告工具:根据操作系统从官方网站下载并配置环境变量
- 安装依赖:
配置环境:
- 修改
config/env.yaml
文件,配置不同环境的基础 URL - 通过
current_env
指定当前使用的环境
- 修改
编写测试用例:
- 在
data/api_cases
目录下创建 YAML 文件编写测试用例 - 测试用例包含请求信息、前置后置操作和断言
- 在
执行测试:
- 运行
python run.py
执行所有测试用例 - 生成的测试报告在
reports/allure-report
目录下 - 可以通过
allure open reports/allure-report
命令查看报告
- 运行
框架特点:
- 测试数据与代码分离,便于维护
- 支持多环境配置
- 自动生成详细的 Allure 测试报告
- 完善的日志记录
- 支持失败重跑
- 丰富的断言方法
这个框架可以根据实际项目需求进行扩展,例如添加数据库操作、接口依赖处理、参数化等功能。
b. web
1.框架整体结构
2.框架使用说明
1.环境准备:
- 安装依赖:
pip install -r requirements.txt
- 安装 Allure 报告工具:根据操作系统从官方网站下载并配置环境变量
2.配置环境:
- 修改
config/env.yaml
配置不同环境的 URL - 通过
config/config.yaml
的current_env
指定当前使用的环境 - 可配置浏览器类型、超时时间、失败重试次数等
3.编写页面元素:
- 在
element
目录下创建 YAML 文件,定义页面元素的定位方式和值 - 支持 id、xpath、css selector 等多种定位方式
4.创建页面对象:
- 在
src/page_objects
目录下创建页面对象类,继承 BasePage - 封装页面操作方法,调用 BasePage 的通用方法
5.编写测试用例 :
- 在
data/web_cases
目录下创建 YAML 文件编写测试用例 - 测试用例包含测试步骤、参数和断言
6.执行测试:
- 运行
python run.py
执行所有测试用例 - 生成的测试报告在
reports/allure-report
目录下 - 可以通过
allure open reports/allure-report
命令查看报告
7.框架特点:
- 采用页面对象模式 (POM),使代码结构清晰,易于维护
- 测试数据与代码分离,通过 YAML 文件管理
- 自动生成详细的 Allure 测试报告,包含步骤、截图和日志
- 支持失败自动截图,便于问题定位
- 支持测试失败重试机制
- 完善的日志记录,便于调试
- 支持多环境配置和多种浏览器
这个框架可以根据实际项目需求进行扩展,例如添加数据库操作、API 调用、更多的断言方式等功能。
c.APP
1.框架整体结构
2.框架使用说明
环境准备
- 安装 Python 3.8+ 和必要依赖:
pip install -r requirements.txt
- 安装 Appium 服务和相关驱动
- 配置 Android SDK 或 Xcode 环境
- 安装 Python 3.8+ 和必要依赖:
配置框架
- 在
config/devices.yaml
中配置测试设备信息 - 在
config/env.yaml
中配置应用环境信息 - 根据需要调整
config/config.yaml
中的全局设置
- 在
编写测试
- 在
elements
目录下定义页面元素 YAML 文件 - 在
src/page_objects
中实现页面对象类 - 在
data/test_cases
中编写 YAML 测试用例 - 在
tests
目录下编写测试脚本
- 在
执行测试
- 启动 Appium 服务:
appium
- 运行测试:
python run.py
- 查看报告:
allure open reports/allure-report
- 启动 Appium 服务:
该框架适合中小型 App 自动化测试项目,通过合理的架构设计和工具集成,能够有效提高测试效率和可维护性,降低自动化测试的实施成本。