pytest+allure 汇总
pytest使用简介
运行多条用例方式
执行当前目录下所有的用例:pytest ./py.test [包名]
执行单独一个pytest模块:pytest 文件名.py
运行某个模块里面某个类:pytest 文件名.py::类名
运行某个模块里面某个类里面的方法:pytest 文件名.py::类名::方法名 :
测试装置介绍
类型 规则 setup_module/teardown_module 全局模块级 setup_class/teardown_class 类级,只在类中前后运行一次 setup_function/teardown_function 函数级,在类外 setup_method/teardown_methond 方法级,类中的每个方法执行前后 setup/teardown 在类中,运行在调用方法的前后(重点)
常用命令行参数
—help 查看帮助命令 -x 用例一旦失败(fail/error),就立刻停止执行-m 标记用例 -k 执行包含某个关键字的测试用例 -v 打印详细日志 -s 打印输出日志(一般-vs一块儿使用) —collect-only(测试平台,pytest 自动导入功能 )
--maxfail=num 用例达到
--使用缓存状态
--lf(--last-failed) 只重新运行故障。
--ff(--failed-first) 先运行故障然后再运行其余的测试
Mark:标记测试用例
- 场景:只执行符合要求的某一部分用例 可以把一个web项目划分多个模块,然后指定模块名称执行。
- 解决: 在测试用例方法上加 @pytest.mark.标签名
- 执行: -m 执行自定义标记的相关用例
pytest -s test_mark_demo.py -m=webtest
pytest -s test_mark_demo.py -m apptest
pytest -s test_mark_demo.py -m "not ios"
Mark:跳过(Skip)及预期失败(xFail)
- 这是pytest 的内置标签,可以处理一些特殊的测试用例【不能成功的测试用例】
- skip - 始终跳过该测试用例
场景: 1、调试时不想运行这个用例 2、标记无法在某些平台上运行的测试功能 3、在某些版本中执行,其他版本中跳过 demo: 连接数据库的功能如果返回结果未成功就跳过,因为执行也都报错 解决1:添加装饰器 @pytest.mark.skip @pytest.mark.skipif 解决2:代码中添加跳过代码 @pytest.skip(reason)
- skipif - 遇到特定情况跳过该测试用例
- xfail - 遇到特定情况,产生一个“期望失败”输出
与skip 类似 ,预期结果为fail ,标记用例为fail 用法:添加装饰器@pytest.mark.xfail
pytest 参数化:Mark:参数化测试函数
测试场景 测试登录成功,登录失败(账号错误,密码错误) 创建多种账号: 中⽂文账号,英⽂文账号 普通测试用例方法 Copy多份代码 or 读⼊入参数? 一次性执⾏多个输⼊入参数 pytest参数化实现方法 @pytest.mark.parametrize进行参数化和数 据驱动更灵活
Mark:参数化测试函数使用
- 单参数
search_list = ['appium','selenium','pytest']
@pytest.mark.parametrize('name',search_list)
def test_search(name):
assert name in search_list
- 多参数
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7+5",12)])
def test_mark_more(test_input,expected):
assert eval(test_input) == expected
- 用例重命名 ids实现
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7+5",12)],ids=['add_3+5=8','add_2+5=7','add_3+5=12'])
def test_mark_more(test_input,expected):
assert eval(test_input) == expected
Python 代码执行 pytest
- 使用 main 函数
if __name__ == '__main__': # 1、运行当前目录下所有符合规则的用例,包括子目录(test_*.py 和 *_test.py) pytest.main() # 2、运行test_mark1.py::test_dkej模块中的某一条用例 pytest.main(['test_mark1.py::test_dkej','-vs']) # 3、运行某个 标签 pytest.main(['test_mark1.py','-vs','-m','dkej']) 运行方式 `python test_*.py `
- 使用python -m pytest调用 pytest(jenkins持续集成用到)
常用的异常处理方法
- try…except
try: 可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]: 处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]: 处理异常的代码块2 except [Exception]: 处理其它异常
- pytest.raises()
获取捕获的异常的细节(异常类型,异常信息) 发生异常,后面的代码将不会被执行
def test_raise():
with pytest.raises(ValueError, match='must be 0 or None'):
raise ValueError("value must be 0 or None")
def test_raise1():
with pytest.raises(ValueError) as exc_info:
raise ValueError("value must be 45")
assert exc_info.type is ValueError
assert exc_info.value.args[0] == "value must be 45"
Allure介绍
• allure 是个轻量级的、灵活的,支持多语言的测试报告工具;
• 多平台的, 奢华的report框架;
• 提供详尽的的测试报告、测试步骤、log;
• Java语言开发的,支持pytest,JaveScript, PHP, ruby
• 可以集成到Jenkins
wins环境准备
java jdk
作用:allure运行依赖java jdk,否则运行allure时会报错
下载:java_jdk_1.8.0
allure
作用:allure服务,展示测试报告
下载:allure-commandline
allure-pytest
作用:python代码中调用pytest,完成测试数据收集、日志收集
安装:pip install allure-pytest
查看版本:allure --version
官方文档:https://docs.qameta.io/allure/
allure 特性:
-- feature/story
• Feature 与 story的关系
• Feature 相当于⼀个功能,⼀个⼤的模块;
• Story相当于对应这个功能或者模块下的不同场景,分支功能;
• Feature和story类似⽗⼦关系
import pytest import allure @allure.description("测试相加的各种情况") @allure.severity("critical") # 优先级,包含blocker, critical, normal, minor, trivial 几个不同的等级 @allure.feature("测试功能_111") # 功能块,feature功能分块时比story大,即同时存在feature和story时,feature为父节点 @allure.story("测试模块_222") # 功能块,具有相同feature或story的用例将规整到相同模块下,执行时可用于筛选 # @allure.testcase("用例名:测试字符串相等") # 用例标识,关联标识用例,可为一个url链接地址 @allure.testcase("http://www.xxx.com/id=1") def test_case01(para_one, para_two): """用例描述:测试字符串相等 :param para_one: 参数1 :param para_two: 参数2 """ logging.info("这是测试的信息,在log中输出") # 获取参数 paras = vars() # 关联的资料信息, 可在报告中记录保存必要的相关信息 allure.attach("用例参数", "{0}".format(paras))
-- severity
• Blocker级别:中断缺陷(客户端程序⽆响应,⽆法执⾏下⼀步操作)
• Critical级别:临界缺陷( 功能点缺失)
• Normal级别:普通缺陷(数值计算错误)
• Minor级别:次要缺陷(界⾯错误与UI需求不符)
• Trivial级别:轻微缺陷(必输项⽆提示,或者提示不规范)
-- step
• 测试过程中每个关键步骤;
• 在app, web自动测试当中,建议每切换到一个新的页面,当做一个step;

with allure.step("步骤"+str(temp)+":"+name): TestInterface.log.info("开始%s接口测试:" % name) url = self.path + url arg = args % TestInterface.dic TestInterface.log.info("请求参数:%s" % arg) if str(is_token) == "1": result = self.opener.header_content_token(path=url, arg=arg, phone=TestInterface.dic['phone'], token=TestInterface.dic['token']) else: result = self.opener.header_content(path=url, arg=arg, phone=TestInterface.dic['phone'])
-- issue,testcase
• 关联测试用例;
• 关联bug

import pytest import allure @allure.issue('http://www.jira.com/id=1') @allure.testcase('http://www.testlink.com/id=1') def test_demo(): print('this is test') with allure.step("打开首页"): allure.attach("参数")
-- parameters
• 一次运行多个测试用例,变量参数化

@pytest.mark.parametrize('test_data1', ['allure', 'pytest', 'unittest']) def test_steps_demo(test_data1): with allure.step('step one:打开浏览器输入网址'): driver = webdriver.Chrome(executable_path='/Users/driver/chromedriver') driver.get('https://www.baidu.com') with allure.step('step two:搜索allure,并点击百度一下'): driver.find_element_by_id('kw').send_keys(test_data1) time.sleep(1) driver.find_element_by_id('su').click() time.sleep(1)
allure – 运行不同测试用例
•按features运行用例
pytest --alluredir= log/report/xml --allure_features=测试登录功能,指定用例 testcases/alluredemo
•按story运行用例
pytest --alluredir= log/report/xml --allure_stories=测试已登录的场景 testcases/alluredemo
•按severity运行用例
pytest --alluredir= log/testreport/json --allure_severities=blocker testcases/alluredemo
allure 命令行生成报告
查看帮助文档:allure -h
语法格式
allure [options] [command] [command options]
options 列表
Options:【用的少】 --help 命令行帮助文档 -q, --quiet 切换至安静模式 Default: false -v, --verbose 切换至冗长模式 Default: false --version 版本信息 Default: false
command 列表
generate
serve
open
generate 命令
作用:生成最终版html 报告【文件在指定磁盘可查】
语法格式:allure generate [options] 报告目录【如:allure generate --clean-alluredir log/testreport/xml -o log/testreport/html】
【注】allure 结果目录就是运行 pytest 命令,--alluredir 跟的那个目录
命令选项:
最常用的就是 -c 、 -o 两个参数。
open 命令行参数
作用:打开已经生成的allure报告,就是打开 generate 命令生成的报告。
语法格式:open [options] allure报告目录 【
allure open allure报告】
命令选项
备注:open常于allure generate 一起使用
serve 命令行参数
作用:启动 allure 服务,生成在线版本报告
语法格式
serve [options] allure结果目录
命令选项

命令格式:allure [option] [command] [command options] # 收集测试结果 -sq 详细信息 pytest [测试文件] -s –q --alluredir=./result/ (—alluredir这个选项 用于指定存储测试结果的路径) pytest -sq --alluredir=./allure 查看测试报告 方式一:生成在线测试报告,会直接打开默认浏览器展示当前报告:allure serve # 打开 allure 报告命令 allure serve ./allure 方式二:生成最终版本测试报告:allure generate + allure open # 生成 allure 的 html 报告 allure generate -c -o ./allure-report ./allure # 打开 allure 报告 allure open ./allure-report
allure使用汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)