Pytest
的入门操作使用pytest
特点:非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
能够支持简单的单元测试和复杂的功能测试
支持参数化
执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败
支持重复执行(rerun)失败的 case
支持运行由 nose, unittest 编写的测试 case
可生成html
报告
方便的和持续集成工具 jenkins
集成
可支持执行部分用例
具有很多第三方插件,并且可以自定义扩展
直接执行 如下命令即可安装pytest
pip install pytest
我们还需要产生测试报表,所以要安装一个第三方插件 pytest-html
,执行如下命令安装
pip install pytest-html
def func(x):
return x + 3
def test_answer():
assert func(3) == 6
class TestClass:
def test_01(self):
print('n用例01')
assert 1 == 1
def test_02(self):
print('n用例02')
assert 2 == 2
def test_03(self):
print('n用例03')
assert 3 == 2
然后,cmd
进入当前文件目录,直接执行
pytest
PS D:Lemonpy45webatuotestpytest_learn> pytest .test_learn01.py
========================================================== test session starts ==========================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:Lemonpy45webatuotestpytest_learn
plugins: allure-pytest-2.9.43, anyio-3.3.2, html-3.1.1, metadata-1.11.0
collected 4 items
test_learn01.py ...F [100%]
=============================================================== FAILURES ================================================================
___________________________________________________________ TestClass.test_03 ___________________________________________________________
self = <test_learn01.TestClass object at 0x0000023FFB6743D0>
def test_03(self):
print('n用例03')
> assert 3 == 2
E assert 3 == 2
test_learn01.py:27: AssertionError
--------------------------------------------------------- Captured stdout call ----------------------------------------------------------
用例03
======================================================== short test summary info ========================================================
FAILED test_learn01.py::TestClass::test_03 - assert 3 == 2
====================================================== 1 failed, 3 passed in 0.21s ======================================================
PS D:Lemonpy45webatuotestpytest_learn>
注意:
如果只执行pytest
,会查找当前目录及其子目录下以 test_*.py 或 *_test.py
文件,找到文件后,在文件中找到以 test 开头函数并执行
如果只想执行某个文件,可以pytest start.py
加上-q,就是显示简单的结果: pytest -q start.py
如果我们希望 显示测试代码中print的内容,因为这些打印语句在调试代码时很有用,可以加上命令行参数 -s
如下
pytest -s
如果我们希望得到更详细的执行信息,包括每个测试类、测试函数的名字,可以加上参数 -v,这个参数可以和 -s 合并为 -sv
如下
pytest -sv
为了防止pytest
到其他目录中找测试用例项,执行测试时,我们可以在命令行加上目标目录 cases ,就是这样
pytest cases
pytest运行方式
测试类主函数模式
# test_abc.py
import pytest # 引入pytest包
def test_a(): # test开头的测试函数
print("------->test_a")
assert 1 # 断言成功
def test_b():
print("------->test_b")
assert 0 # 断言失败
if __name__ == '__main__':
# pytest.main("-s test_abc.py") 早期版本是这样的执行的
pytest.main(["-s", "test_abc.py"]) # 调用pytest的main函数执行测试
# pytest 文件路径/测试文件名
pytest ./test_abc.py
Pytest
用例的设计原则用Pytest
写用例时候,一定要按照下面的规则去写,否则不符合规则的测试用例是不会执行的
文件名以 test_*.py
文件和*_test.py
以 test_ 开头的函数
以 Test 开头的类,不能包含__init
__ 方法
所有的包 package 必须要有__init__.py
文件
Pytest
之并发执行在Pytest测试框架中提供了pytest-xdist可以并发执行测试用例,来提升测试用例的执行速度。通常的情况下,测试用例的执行都是依据一定的规则来按顺序进行执行,这样的结果是每次执行的时候有的资源就只能被一个测试用例占用,而达不到测试用例执行的时候资源的共享,插件pytest-xdist插件可以很好的解决这个问题,一方面资源达到共享,基于第一点的考虑,也就达到了第二点的提升了测试执行的效率。
安装pytest-xdist插件 pip install pytest-xdist
使用 pytest -n auto 默认自动检查系统cpu个数,然后进行并发
也可以指定并发数 pytest -n 2 即并发数2执行
安装:pip3 install pytest-repeat
使用–count命令行选项来指定您要运行一个或多个测试的次数:
pytest --count = 10 test.py
如果要在代码中将测试标记为重复多次,则可以使用
# @pytest.mark.repeat(count)装饰器:
import pytest
@pytest.mark.repeat(3)
def test_example():
print("执行成功")
有时候,功能模块不稳定,会存在一些错误,可以将 -x 与 pytest-repeat 一起用,强制运行器在第一次测试失败时停止
py.test --count=1000 -x test.py
命令行参数
作用:能够覆盖默认的测试用例执行顺序,相似fixture的scope参数
function:默认,范围针对每一个用例重复执行,再执行下一个用例
class:以class为用例集合单位,重复执行class里面的用例,再执行下一个
pytest -s --count=2 --repeat-scope=class test_Class.py
module:以模块为单位,重复执行模块里面的用例,再执行下一个
pytest -s --count=2 --repeat-scope=moudle test_Class.py
session:重复整个测试会话,即全部测试用例的执行一次,而后再执行第二次
前面在安装pytest
,我们也安装了 pytest-html
插件,这个插件就是用来产生测试报告的。
要产生报告,在命令行加上 参数 --html=report.html --self-contained-html
,如下
pytest cases --html=report.html --self-contained-html
这样就会产生名为 report.html
的测试报告文件,可以在浏览器中打开