pytest 从百草园到三味书屋....
Posted android超级兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest 从百草园到三味书屋....相关的知识,希望对你有一定的参考价值。
pytest 从百草园到三味书屋...
底部会给出完整代码!
开发环境:
- pytest 6.2.5
- python 2.7.16
- allure 2.14.0
- PyCharm 2021.2.3
- system mac
废话不多说,直接上干货!!
pytest简单认识:
pytest的默认规则
定义pytest时,包名,类名,默认必须以test开头.
先来看一个简单的例子!
执行结果为:
test_11.py ... [ 33%]
test_12.py ... [ 66%]
test_13.py ... [100%]
可以看出,默认执行是显示的进度
输出详细信息 [-s]
# 用于关闭捕捉信息, 从而输出打印信息
pytest.main(['-s'])
需要注意的是:
- 执行成功用 . 表示
- 执行失败用 F 表示
如果觉得这种方式不明显,可以采用:
显示具体测试用例信息[-v]
#T ODO -s 用于关闭捕捉信息, 从而输出打印信息
# TODO -v 用于显示具体的信息
pytest.main(['-s', '-v'])
简化测试用例信息[-q]
# TODO -q 简化输出信息
pytest.main(['-s', '-q'])
执行特定测试用例[-k]
# TODO -k 运行某个包含特定字符串的测试用例
pytest.main(['-s', '-v', '-k', 'b'])
test_13.py::test_function_b ======test_function !!!!!!!!b!!!!!!!!
PASSED
执行到失败的测试用例就终止[-x]
# TODO -x 只要执行到失败的测试用例就终止测试
pytest.main(['-x'])
执行某个特定用例
场景: test_demo1要执行test_demo2某个测试用例
现在是执行不到的…
# TODO 只执行某个特定用例
pytest.main(['-s', '.', '../test_demo2/test_21.py::test_function_01'])
还有一种简单粗暴的写法:用来执行所有的测试用例
# TODO 执行所有的测试用例
pytest.main(['-s', '..'])
测试用例失败%d个就结束[–maxfail=2]
# TODO 测试用例 失败2个就退出
pytest.main(['--maxfail=2'])
打标记[slow]
# TODO 打标记,只执行标记slow的测试用例
pytest.main(['-m', 'slow'])
注意这里的slow是随便写的,也可以写成其他的,例如这样:
pytest.main(['-m', 'abc'])
pytest最原始的测试报告[–junit-xml=./report/xxx.xml]
# TODO 生成最原始的测试报告
pytest.main(['--junit-xml=./report/最原始的测试报告.xml'])
单独执行某个用例
# TODO 单独执行某个用例
pytest.main(['-s', 'test_11.py'])
错误用例单独执行%d次[–reruns=2]
# TODO 失败用例执行2次
pytest.main(['-s', '--reruns=2', 'test_11.py'])
错误用例单独执行%d次,每次间隔%d秒[’–reruns=2’,’–reruns-delay=3’]
# TODO 失败用例执行2次 每次等待3秒
pytest.main(['-s', '--reruns=2', '--reruns-delay=3', 'test_11.py'])
函数中的 前置函数/后置函数 and 前置module/后置module
# TODO 测试用例最开始前执行
def setup_module():
print("setup_module".format("*" * 20, "*" * 20, ))
# TODO 测试用例结束时执行
def teardown_module():
print("teardown_module".format("*" * 20, "*" * 20, ))
# TODO 每个测试用例函数开始前执行
def setup_function():
print("setup_function".format("-" * 20, "-" * 20, ))
# TODO 每个测试用例结束后执行
def teardown_function():
print("teardown_function".format("-" * 20, "-" * 20, ))
# TODO 每个测试用例函数开始前执行 在setup_function() 之后执行
def setup():
print("setup".format("+" * 20, "+" * 20, ))
# TODO 每个测试用例结束后执行 在 teardown_function() 之前执行
def teardown():
print("teardown".format("+" * 20, "+" * 20, ))
def test_0():
print("test0")
def test_1():
print("test1")
def test_2():
print("test2")
def test_3():
print("test3")
运行结果为:
test_14.py ********************setup_module********************
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test0
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test1
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test2
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test3
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
********************teardown_module********************
这里都比较无脑,都是一些常规操作…细细品味一下就懂了!!
小结:
pytest | 说明 |
---|---|
-s | 输出详细信息 |
-v | 显示具体测试用例 |
-q | 简化测试用例输出 |
-x | 执行到失败的测试用例就结束 |
-k | 执行特定的测试用例 |
-maxfail=2 | 执行2条测试用例失败就结束 |
‘-m’ ‘slow’ | 打标记 |
–junit-xml=./report/xxx.xml | 最原始的测试报告 |
–reruns=2 | 错误用例单独执行2次 |
‘–reruns=2’, ‘–reruns-delay=3’ | 错误用例单独执行2次,每次间隔3秒 |
pytest类中的操作
默认操作也是一样的
注意点:
- 类名默认以Test开头
- 方法名默认以test开头
这里说是默认以test开头,就证明这里可以修改,不要着急,一点点看,后面会介绍!
类中的前置函数/后置函数,and 前置module/后置module
测试代码:
class TestDemo31:
# TODO 测试用例最开始前执行
@staticmethod
def setup_class():
print("setup_class".format("*" * 20, "*" * 20, ))
# TODO 测试用例结束时执行
@staticmethod
def teardown_class():
print("teardown_module".format("*" * 20, "*" * 20, ))
# TODO 每个测试用例函数开始前执行
@staticmethod
def setup_method():
print("setup_method".format("-" * 20, "-" * 20, ))
# TODO 每个测试用例结束后执行
@staticmethod
def teardown_method():
print("teardown_method".format("-" * 20, "-" * 20, ))
# TODO 每个测试用例函数开始前执行 在setup_function(self) 之后执行
@staticmethod
def setup():
print("setup".format("+" * 20, "+" * 20, ))
# TODO 每个测试用例结束后执行 在 teardown_function(self) 之前执行
@staticmethod
def teardown():
print("teardown".format("+" * 20, "+" * 20, ))
def test_01(self):
print("测试数据1")
def test_02(self):
print("测试数据2")
def test_03(self):
print("测试数据3")
使用:
import pytest
if __name__ == '__main__':
pytest.main(['-s', '-q', 'test_31.py'])
测试结果:
********************setup_class********************
--------------------setup_method--------------------
++++++++++++++++++++setup+++++++以上是关于pytest 从百草园到三味书屋....的主要内容,如果未能解决你的问题,请参考以下文章