pytest(10)-常用执行参数说明
pytest单元测试框架中可以使用命令行
及代码pytest.main()
两种方式执行测试,且可以加入各种参数来组织执行测试。接下来我们来了解常用的执行参数的含义及其用法。
pytest中的执行参数根据作用的不同大致可以分为以下几类:
- 指定测试用例
- 控制执行过程
- 结果展示
每个示例都会以pytest.main()形式
及命令行形式
两种方式进行说明。
指定测试用例
运行指定路径的测试用例
# 运行当前文件所在的同级目录中,testcase文件夹里的所有测试用例
pytest.main(["./testcase"])
# 也可以写成如下形式。后续示例中都将`./`省略
pytest.main(["testcase"])
# 命令行形式
pytest
# 运行指定模块
pytest.main(["testcase/test_case.py"])
# 命令行形式
pytest testcase/test_case.py
# 运行指定模块中的测试类
pytest.main(["testcase/test_case.py::TestOrder"])
# 命令行形式
pytest testcase/test_case_1.py::TestOrder
# 运行指定类中的测试方法
pytest.main(["testcase/test_case.py::TestOrder::test_order"])
# 命令行形式
pytest testcase/test_case.py::TestOrder::test_order
-m
运行指定标记的测试用例
我们之前已经讲过怎么标记用例,可以查看[]
# 运行被标记为smoke的用例
pytest.main(['-m smoke'])
# 命令行形式
pytest -m smoke
# 运行被标记为smoke或order的用例
pytest.main(["-m", "smoke or order"])
# 命令行形式
pytest -m "smoke or order"
-k
运行匹配指定字符串的测试用例
-k
指定字符串,用于匹配包名、模块名、类名、测试函数名/方法名,这些命名中包含指定的字符串则匹配并执行。
# 运行包名、模块名、类名、测试函数名/方法名中包含order的测试用例
pytest.main(["-k", "order"])
# 命令行形式
pytest -k order
# 运行指定模块中的类名、测试函数名/方法名中包含order的测试用例
pytest.main(["-k", "order", "testcase/test_case.py"])
# 命令行形式
pytest -k login testcase/test_case.py
# 运行指定类中测试函数名包含order的测试用例
pytest.main(["-k", "order", "testcase/test_case.py::TestOrder"])
# 命令行形式
pytest -k order testcase/test_case.py::TestOrder
控制执行过程
用例失败重新执行次数
用例执行时有可能会出现某些偶然因素导致用例断言失败但实际又不是bug的情况,如网络波动导致响应时间慢,此时用例失败后再次去重新执行该用例就显得很重要。
pytest提供了一个常用的插件pytest-rerunfailures
,用于设置测试用例运行失败后的最多重新执行次数(即重试机制)。
使用之前需要先安装:pip install pytest-rerunfailures
,使用方式如下:
# 运行失败后该用例重新运行最多3次
pytest.main(["--reruns", "3", "testcase/test_case.py"])
# 命令行形式
pytest --reruns=3 testcase/test_case.py
用例执行失败则停止运行
根据需求提供一下两种方式:
-x
或--exitfirst
,遇到用例执行失败就停止项目的运行,只要失败就立即停止运行--maxfail=num
,遇到多少次用例执行失败就停止项目运行,num
表示用例运行失败次数
# -x,遇到执行用例失败则停止整个项目的运行
pytest.main(["-x", "testcase/test_case.py"])
# 命令行形式
pytest -x testcase/test_case.py
# --maxfail,如累计有5次用例执行失败则停止整个项目的运行
pytest.main(["--maxfail", "5", "testcase/test_case.py"])
# 命令行形式
pytest --maxfail=5 testcase/test_case.py
运行上次失败用例
当bug修复完成后,我们可能只需要去执行上次运行失败的用例,在pytest中就提供了这样的功能,需要用到一下参数:
--lf
或--last-failed
,只执行上次运行失败的用例,若上次运行没有失败用例则会执行全部用例。--ff
或--failed-first
,首先执行上次运行失败的用例,再执行项目中其他所有用例。
# --lf,只执行上次运行失败的用例,若上次运行没有失败用例则会执行全部用例
pytest.main(["--lf", "testcase/test_case.py"])
# 命令行形式
pytest --lf testcase/test_case.py
# --ff,首先执行上次运行失败的用例,再执行项目中其他所有用例
pytest.main(["--ff", "testcase/test_case.py"])
# 命令行形式
pytest --ff testcase/test_case.py
执行结果展示
与展示结果相关的常用的参数有以下几个:
-s
,在测试结果中显示测试用例里print的内容(执行结果默认不显示测试用例中print的内容)。-v
,显示更详细的测试结果。-q
,展示简略的测试结果,与-v
作用刚好相反。
# -s,测试结果中显示测试用例里print的内容
pytest.main(["-s", "testcase/test_case.py"])
# 命令行形式
pytest -s testcase/test_case.py
# -v,设置测试结果显示的详细程度
pytest.main(["-v", "testcase/test_case.py"])
# 命令行形式
pytest -v testcase/test_case.py
# -q,设置测试结果显示的详细程度
pytest.main(["-q", "testcase/test_case.py"])
# 命令行形式
pytest -q testcase/test_case.py
示例
测试用例写在testcase/test_case.py
中,项目执行代码写在与testcase
同级目录的run.py
中,简单示例如下:
test_case.py
:
def test_01():
print("执行test_01")
a = "hello"
b = "hi"
assert a != b
def test_02():
print("执行test_02")
a = "hello"
b = "hi"
assert a == b
class TestOrder:
def test_order(self):
print("下单")
run.py
:
import pytest
if __name__ == '__main__':
pytest.main(["-s", "-v", "--reruns", "2", "testcase/test_case.py"])
运行run.py
或命令行pytest -s -v --reruns=2 testcase/test_case.py
,结果如下:
我们可以看出来:
- 因为
-s
,结果中打印了测试用例中print
里面的内容。 - 因为
-v
,显示了较为详细的测试结果(不加-v
则只显示执行的测试模块,不显示测试用例而是用.
表示)。 - 因为
--reruns
2
,因为test_02
的断言始终是失败的,所以失败后又执行了2
次,总共执行了3
次。
总结
这里只列举了一些常用的运行方法与参数,大家可以在自己的自动化项目中尝试着使用这些方式与参数。
pytest(10)-常用执行参数说明的更多相关文章
- Pytest命令行执行测试
Pytest命令行执行测试 from collections import namedtuple Task = namedtuple('Task', ['summary','owner','done' ...
- python常用执行方式&变量&input函数
linux系统中执行py文件方式: ./a.py 需要执行权限 chmod -R 777(最大权限) 常用执行方式: 1. ./a.py2. python a.py 文件内部头加上 #!/usr/b ...
- 每10秒执行定时任务-crontab
* * * * * /data/crontab.sh * * * * * sleep 10; /data/crontab.sh * * * * * sleep 20; /data/crontab.sh ...
- 【前端】javascript中10常用的个小技巧总结
javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了 ...
- DG on Windows 10 S: 执行任意代码
DG on Windows 10 S: 执行任意代码 windows 10 S版本是什么鬼? 众所周知,我们使用的是windows 10企业版 LTSC.更准确一点,CMD运行winver,我的版本是 ...
- Python单元测试框架之pytest 1 ---如何执行测试用例
From: https://www.cnblogs.com/fnng/p/4765112.html 介绍 pytest是一个成熟的全功能的Python测试工具,可以帮助你写出更好的程序. 适合从简 ...
- Pytest_常用执行参数详解(3)
前面讲了测试用例的执行方式,也认识了 -v -s 这些参数,那么还有没有其它参数呢?答案肯定是有的,我们可以通过 pytest -h来查看所有可用参数. 从图中可以看出,pytest的参数有很多,但 ...
- pytest多进程/多线程执行测试用例
前言: 实际项目中的用例数量会非常多,几百上千:如果采用单进程串行执行的话会非常耗费时间.假设每条用例耗时2s,1000条就需要2000s $\approx$ 33min:还要加上用例加载.测试前/后 ...
- AngularJs自定义指令详解(10) - 执行次序
代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...
随机推荐
- SYCOJ137斜线输出(1)
题目-斜线输出(1) (shiyancang.cn) 在同一斜线上的满足方程.坐标关系计算即可. #include<bits/stdc++.h> using namespace std; ...
- 信不信由你!iPhone6屏幕宽度不一定是375px,iPhone6 Plus屏幕宽度不一定是414px
看到这个题目你可能不信,引出这个问题的缘由是几次项目中Chrome模拟器和iPhone6真机预览效果不一致. 为什么在Chrome Emulation模拟手机页面和真机预览效果不一致? 以前觉得不外乎 ...
- antd的table组件设置Column的width列宽度不生效问题
超长连续字段(长数字和长单词) 破坏表格布局的问题(即使你指定了列的宽度也会被挤开),之前组件内默认加过 word-break: break-word; 去纠正此类布局,又会引起其他的问题. 所以最好 ...
- .NET Core 利用委托进行动态流程组装
引言 在看.NET Core 源码的管道模型中间件(Middleware)部分,觉得这个流程组装,思路挺好的,于是就分享给大家.本次代码实现就直接我之前写的动态代理实现AOP的基础上直接改了,就不另起 ...
- Vulnhub系列:Tomato(文件包含getshell)
这个靶机挺有意思,它是通过文件包含漏洞进行的getshell,主要姿势是将含有一句话木马的内容记录到ssh的登录日志中,然后利用文件包含漏洞进行包含,从而拿到shell 0x01 靶机信息 靶机:To ...
- Ubuntu16桌面版编译和安装OpenCV4
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- leetcode 13. 罗马数字转整数 及 12. 整数转罗马数字
13. 罗马数字转整数 问题描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如,罗马数 ...
- C#检测外部exe程序弹窗错误,并重启
private void button2_Click(object sender, EventArgs e) { string mainTitle = System.Configuration.Con ...
- [USB波形分析] 全速USB波形数据分析(一)
在之前的文章一次CAN波形分析之旅里,根据示波器采集的波形数据,详细地分析了CAN通信.今天来分析USB数据,还是同样的流程,但是这次使用matplotlib来协助分析. USB基本波形 USB通过一 ...
- MySQL数据库学习打卡 DAY2
今天学习了MySQL的DML操作,完成了关于增删改查所有基本内容的学习.