Pytest-工作原理

Pytest 官方文档

介绍

pytest 是 Python 的一个测试框架.

其会自动搜寻测试文件和函数, 并在 assert 出错时会显示更详细的信息.

安装

1
pip install pytest

简单示例

pytest 会递归查找目录下所有 test_*.py*_test.py 文件并运行其中以 test 开头的函数, 收集其报错信息. 其也会查找以 Test 开头的类之下以 test 开头的方法.

1
2
3
4
5
6
# test_sample.py
def func(x):
return x + 1

def test_answer():
assert func(3) == 5

然后运行:

1
pytest

输出如:

基本使用

指定测试文件/函数

指定文件:

1
pytest test_mod.py

指定目录:

1
pytest testing/

指定函数:

1
pytest tests/test_mod.py::test_func

指定函数以及参数:

1
pytest tests/test_mod.py::test_func[x1,y2]

指定类:

1
pytest tests/test_mod.py::TestClass

指定类下的方法:

1
pytest tests/test_mod.py::TestClass::test_method

从文件读取参数列表:

1
pytest @tests_to_run.txt

tests_to_run.txt 的文件内容为:

1
2
3
4
tests/test_file.py
tests/test_mod.py::test_func[x1,y2]
tests/test_mod.py::TestClass
-m slow

报告测试结果

assert

最简单的方法是用 assert 函数的测试结果. 如:

1
2
3
4
5
6
# content of test_assert1.py
def f():
return 3

def test_function():
assert f() == 4

expected exceptions

通过捕获 exceptions 来报告, 是用 pytest.raises() 来指定包捕获的类型, 如:

1
2
3
4
5
6
7
8
def test_recursion_depth():
with pytest.raises(RuntimeError) as excinfo:

def f():
f()

f()
assert "maximum recursion" in str(excinfo.value)

指定外部模块位置

借助 PYTHONPATH 环境变量, 其用于指定 Python 解释器在导入模块时查找模块的路径, 如:

1
PYTHONPATH=src pytest

测试某函数是否引发某异常

如:

1
2
3
4
5
6
7
8
9
# content of test_sysexit.py
import pytest

def f():
raise SystemExit(1)

def test_mytest():
with pytest.raises(SystemExit):
f()

其测试 f() 函数是否引发了 SystemExit 类型错误.

若引发了, 则会 pass, 如:

若没引发, 则会 fail, 如:


Pytest-工作原理
http://example.com/2024/09/02/Pytest-工作原理/
作者
Jie
发布于
2024年9月2日
许可协议