pytest单元测试
安装pytest
pip install -U pytest
创建第一个测试样例
创建一个名为 的新文件,其中包含一个函数和一个测试:test_sample.py
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
是指运行所有测试用例的总体进度。完成后,pytest 将显示失败报告,因为 不返回 。[100%]func(3)5
运行多个测试
pytest将运行当前目录及其子目录中test_.py或_test.py 的所有文件。
pytest按照以下标准查找需要测试的py文件:
- 如果未指定任何参数,则从测试路径(如果已配置)或当前目录开始收集。或者,命令行参数可用于目录、文件名或节点 ID 的任意组合。
- 递归到目录中,除非它们与 norecursedir 匹配。
- 在这些目录中,搜索 或 文件,按其测试包名称导入。test_.py_test.py
- 从这些文件中,收集测试项目:
test类外的前缀测试函数或方法
test带前缀的测试函数或带前缀的测试类内的方法(没有方法)Test__init__
捕获异常
使用 pytest.raises() 进行异常捕获:
# content of test_sysexit.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
以“安静”报告模式执行测试功能:
固定装置/固件(fixture)
使用 @pytest.fixture 将函数定义为固定装置(固件),最简单的使用方式是作为测试函数的参数 。使用固定装置的好处是可以重复使用、装置可以请求其他装置等。
fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。
方法:fixture(scope=“function”, params=None, autouse=False, ids=None, name=None)
固定装置可以设置范围(scope),可能的值包括:
- function :默认范围,每个测试函数都会执行一次 fixture。
- class :每个测试类执行一次fixture,所有方法都可以使用。
- module :每个模块执行一次 fixture,模块内函数和方法都可以使用。
- package:每个包执行一次 fixture,包内的模块、函数、方法都可以使用。
- session :一次测试只执行一次fixture,所有被找到的函数和方法都可用。
params:(list类型)提供参数数据,供调用标记方法的函数使用
autouse:是否自动运行,默认为False不运行,设置为True自动运行
import pytest
class Test_ABC:
@pytest.fixture()
def before(self):
print("------->before")
def test_a(self,before): # ️ test_a方法传入了被fixture标识的函数,已变量的形式
print("------->test_a")
assert 1
if __name__ == '__main__':
pytest.main("-s test_abc.py")
执行结果:
test_abc.py
------->before # 发现before会优先于测试函数运行
------->test_a