pytest02 Installation and Getting Started
PDF文档 : download latest
pytest 是一个使构建简单和可伸缩的测试变得容易的框架。测试具有表达性和可读性,不需要样板代码。几分钟后就可以开始对应用程序或库进行小的单元测试或复杂的功能测试。
安装 pytest
- 在命令行中运行以下命令:
1 | pip install -U pytest |
- 检查是否安装了正确的版本:
1 | $ pytest --version |
创建第一个测试
创建一个简单的测试函数:
1 | # content of test_sample.py |
现在可以执行测试功能:
1 | $ pytest |
此测试返回失败报告,因为 func(3) 不返 5 .
运行多个测试
pytest 将在当前目录及其子目录中,运行所有这种形式的文件:test _*.py 或者 * _test.py。
断言引发了某个异常
使用 raises 断言某些代码引发异常:
1 | # content of test_sysexit.py |
以“ quiet ”报告模式执行测试功能:
1 | $ pytest -q test_sysexit.py |
将一个类中的多个测试分组
一旦开发了多个测试任务,可能希望将它们分组到一个类中。pytest很容易创建包含多个测试的类:
1 | # content of test_class.py |
pytest 会发现所有带 test_前缀的函数。不需要对任何内容进行子类化。我们只需通过传递模块的文件名来运行它:
1 | $ pytest -q test_class.py |
第一个测试函数通过,第二个失败。容易看到断言中的中间值,理解运行失败的原因。
请求功能测试的唯一临时目录
pytest 提供了 Builtin fixtures/function arguments 请求任意资源,如唯一的临时目录:
1 | # content of test_tmpdir.py |
在测试函数签名中列出 tmpdir 名字, pytest 将在执行测试函数调用之前查找并调用一个fixture工厂以创建资源。在测试运行之前, pytest 创建一个unique-per-test-invocation(唯一的每个测试调用的)临时目录:
试下了,有时候这个临时目录不会自动删除,于是写一个 fixture 来删除:
1 | import shutil |
找出其他的内置 pytest fixtures 使用以下命令:
1 | pytest --fixtures # shows builtin and custom fixtures |
常用的内置 fixture
request:request是一个非常强大的内置 fixture,它提供了对当前测试请求的访问。通过request,你可以获取到诸如当前测试函数的名称、参数、配置选项等信息。- 常见的用法包括:
request.node获取当前节点(可以是测试函数或测试类),request.config访问配置对象,request.param在参数化测试中获取当前参数等。
tmp_path和tmp_path_factory:tmp_path提供了一个临时目录的路径,该路径在测试结束时会被自动清理。这对于需要临时文件或目录的测试非常有用。tmp_path_factory可以用来创建多个临时目录,通常用于需要多个独立临时目录的场景。
capfd和capsys:capfd和capsys用于捕获标准输出和标准错误流。capsys适用于捕获stdout和stderr的文本输出,而capfd则适用于捕获文件描述符级别的输出。- 例如,你可以使用
capsys.readouterr()来获取捕获的输出。
monkeypatch:monkeypatch用于在测试期间动态修改模块、类或方法的行为。这在需要模拟外部依赖或环境变量时非常有用。- 例如,你可以使用
monkeypatch.setattr来替换一个方法或属性,或者使用monkeypatch.setenv来设置环境变量。
recwarn:recwarn用于捕获警告。这对于测试代码中是否正确地触发了预期的警告非常有用。- 例如,你可以使用
recwarn.pop(UserWarning)来检查是否触发了特定类型的警告。
pytestconfig:pytestconfig提供了对pytest配置对象的访问,可以用来获取命令行参数或配置文件中的选项。- 例如,你可以使用
pytestconfig.getoption来获取某个配置选项的值。
record_property,record_xml_property:- 这些 fixture 用于记录额外的测试属性,这些属性可以在测试报告中显示。
- 例如,你可以使用
record_property("key", "value")来记录一个键值对。
usefixtures:usefixtures不是一个 fixture,而是一个装饰器,用于在测试函数或类上显式地使用一个或多个 fixture。- 例如,
@pytest.mark.usefixtures("my_fixture")可以用来指定某个测试函数或类使用my_fixture。
filterwarnings:filterwarnings用于过滤掉特定的警告,避免它们干扰测试输出。- 例如,你可以使用
@pytest.mark.filterwarnings("ignore:.*DeprecationWarning")来忽略所有DeprecationWarning。