- Pytest:帮助您编写更好的程序
- 完整的 Pytest 文档
- 安装和入门
- 使用和调用
- 在现有测试套件中使用 pytest
- 测试中断言的编写和报告
- Pytest 夹具:显式、模块化、可扩展
- 用属性标记测试函数
- MonkeyPatching / Mocking 模块和环境
- 临时目录和文件
- 捕获 stdout/stderr 输出
- 捕获警告
- 模块和测试文件的 Doctest 集成
- 跳过和 xfail:处理无法成功的测试
- 参数化夹具和测试功能
- 缓存:使用交叉测试运行状态
- UnitTest.TestCase 支持
- 运行为鼻子编写的测试
- 经典的 Xunit 风格设置
- 安装和使用插件
- 编写插件
- 登录
- 良好的集成实践
- 古怪的测试
- Pytest 导入机制和 sys.path/PYTHONPATH
- 设置 bash 完成
- API 引用
- _pytest.hookspec
- _pytest.python_api
- _pytest.outcomes
- _pytest.config
- _pytest.mark
- _pytest.recwarn
- _pytest.assertion
- _pytest.freeze_support
- _pytest.fixtures
- _pytest.cacheprovider
- _pytest.capture
- _pytest.doctest
- _pytest.junitxml
- _pytest.logging
- _pytest.monkeypatch
- _pytest.pytester
- _pytest.tmpdir
- _pytest.python
- _pytest.nodes
- _pytest.reports
- _pytest._code.code
- _pytest.config.argparsing
- _pytest.main
- pluggy.callers
- _pytest.config.exceptions
- py.test 2.0.0:断言++、UnitTest++、Reporting++、Config++、Docs++
- 示例和自定义技巧
- 配置
- 贡献开始
- 向后兼容策略
- Python 2.7 和 3.4 支持
- 企业版 pytest
- 项目实例
- 历史笔记
- 弃用和移除
- 发展指南
- 演讲和辅导
安装和入门
** Python ** :Python 3.6,3.7,3.8,3.9,PyPy3
平台 :Linux和Windows
PYPI包名称 : pytest
PDF文档 : download latest
pytest
是一个使构建简单和可伸缩的测试变得容易的框架。测试具有表达性和可读性,不需要样板代码。几分钟后就可以开始对应用程序或库进行小的单元测试或复杂的功能测试。
安装 pytest
在命令行中运行以下命令:
pip install -U pytest
检查是否安装了正确的版本:
$ pytest --version pytest 6.2.1
创建第一个测试
用四行代码创建一个简单的测试函数:
# content of test_sample.py def func(x): return x + 1 def test_answer(): assert func(3) == 5
就是这样。现在可以执行测试功能:
$ pytest =========================== test session starts ============================ platform linux -- Python 3.x.y, pytest-6.x.y, py-1.x.y, pluggy-0.x.y cachedir: $PYTHON_PREFIX/.pytest_cache rootdir: $REGENDOC_TMPDIR collected 1 item test_sample.py F [100%] ================================= FAILURES ================================= _______________________________ test_answer ________________________________ def test_answer(): > assert func(3) == 5 E assert 4 == 5 E + where 4 = func(3) test_sample.py:6: AssertionError ========================= short test summary info ========================== FAILED test_sample.py::test_answer - assert 4 == 5 ============================ 1 failed in 0.12s =============================
这个 [100%]
指运行所有测试用例的总体进度。完成后,pytest会显示一个失败报告,因为 func(3)
不返 5
.
注解
你可以使用 assert
验证测试期望的声明。皮特试验 Advanced assertion introspection 将智能地报告断言表达式的中间值,以便避免使用多个名称 of JUnit legacy methods .
运行多个测试
pytest
将运行窗体测试的所有文件_ *.py or * _当前目录及其子目录中的test.py。一般来说,它是 standard test discovery rules .
断言引发了某个异常
使用 raises 助手来断言某些代码引发异常:
# content of test_sysexit.py import pytest def f(): raise SystemExit(1) def test_mytest(): with pytest.raises(SystemExit): f()
以 安静 报告模式执行测试功能:
$ pytest -q test_sysexit.py . [100%] 1 passed in 0.12s
注解
这个 -q/--quiet
flag在本例和下面的示例中保持输出简短。
将一个类中的多个测试分组
一旦开发了多个测试,您可能需要将它们分组到一个类中。pytest使创建包含多个测试的类变得很容易:
# content of test_class.py class TestClass: def test_one(self): x = "this" assert "h" in x def test_two(self): x = "hello" assert hasattr(x, "check")
pytest
发现以下所有测试 Conventions for Python test discovery ,所以它发现 test_
前缀函数。没有必要对任何东西进行子类化,但是要确保在类前面加上 Test
否则将跳过该类。我们只需传递其文件名即可运行该模块:
$ pytest -q test_class.py .F [100%] ================================= FAILURES ================================= ____________________________ TestClass.test_two ____________________________ self = <test_class.TestClass object at 0xdeadbeef> def test_two(self): x = "hello" > assert hasattr(x, "check") E AssertionError: assert False E + where False = hasattr('hello', 'check') test_class.py:8: AssertionError ========================= short test summary info ========================== FAILED test_class.py::TestClass::test_two - AssertionError: assert False 1 failed, 1 passed in 0.12s
第一次测试通过,第二次失败。您可以很容易地看到断言中的中间值,以帮助您理解失败的原因。
将测试分组在类中是有益的,原因如下:
试验机构
仅在该特定类中共享测试夹具
在类级别应用标记并将其隐式应用于所有测试
在类中对测试分组时需要注意的是,每个测试都有一个唯一的类实例。让每个测试共享同一个类实例将非常不利于测试隔离,并且会导致不良的测试实践。概述如下:
# content of test_class_demo.py class TestClassDemoInstance: def test_one(self): assert 0 def test_two(self): assert 0
$ pytest -k TestClassDemoInstance -q FF [100%] ================================= FAILURES ================================= ______________________ TestClassDemoInstance.test_one ______________________ self = <test_class_demo.TestClassDemoInstance object at 0xdeadbeef> def test_one(self): > assert 0 E assert 0 test_class_demo.py:3: AssertionError ______________________ TestClassDemoInstance.test_two ______________________ self = <test_class_demo.TestClassDemoInstance object at 0xdeadbeef> def test_two(self): > assert 0 E assert 0 test_class_demo.py:6: AssertionError ========================= short test summary info ========================== FAILED test_class_demo.py::TestClassDemoInstance::test_one - assert 0 FAILED test_class_demo.py::TestClassDemoInstance::test_two - assert 0 2 failed in 0.12s
请求功能测试的唯一临时目录
pytest
提供 Builtin fixtures/function arguments 要请求任意资源,例如唯一的临时目录,请执行以下操作:
# content of test_tmpdir.py def test_needsfiles(tmpdir): print(tmpdir) assert 0
列出名字 tmpdir
在测试函数签名和 pytest
将在执行测试函数调用之前查找并调用fixture工厂以创建资源。在测试运行之前, pytest
创建唯一的每个测试调用临时目录:
$ pytest -q test_tmpdir.py F [100%] ================================= FAILURES ================================= _____________________________ test_needsfiles ______________________________ tmpdir = local('PYTEST_TMPDIR/test_needsfiles0') def test_needsfiles(tmpdir): print(tmpdir) > assert 0 E assert 0 test_tmpdir.py:3: AssertionError --------------------------- Captured stdout call --------------------------- PYTEST_TMPDIR/test_needsfiles0 ========================= short test summary info ========================== FAILED test_tmpdir.py::test_needsfiles - assert 0 1 failed in 0.12s
有关TMPDIR处理的更多信息,请访问 Temporary directories and files .
找出什么样的内置 pytest fixtures 使用以下命令存在:
pytest --fixtures # shows builtin and custom fixtures
注意,这个命令省略了前导的fixtures _
除非 -v
选项已添加。
继续阅读
查看其他Pytest资源以帮助您为独特的工作流自定义测试:
通过调用pytest python -m pytest ,用于命令行调用示例
在现有测试套件中使用pytest ,用于处理预先存在的测试
用属性标记测试函数 以获取有关
pytest.mark
机制Pytest夹具:显式、模块化、可扩展 ,用于为测试提供功能基线
:ref:'plugins`'用于管理和写入插件
:ref:'goodpractices`'用于virtualenv和测试布局
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论