pytest

203 阅读3分钟

pytest是一个使构建简单和可扩展测试变得容易的框架。测试具有表现力和可读性,不需要样板代码。数分钟内即可开始为您的应用程序或库进行小型单元测试或复杂的功能测试。

安装

  1. 在命令行中运行以下命令:
pip install -U pytest
  1. 检查您是否安装了正确的版本:
pytest --version

pytest 6.0.2

编写规则:

  • 测试文件以test_开头/以_test结尾
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头
  • 断言使用基本的assert即可

fixture的scope参数

scope参数有四种,分别是'function','module','class','session',默认为function。

  • function:每个test都运行,默认是function的scope
  • class:每个class的所有test只运行一次
  • module:每个module的所有test只运行一次
  • session:每个session只运行一次

setup和teardown操作

  • setup,在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等
  • teardown,在测试函数或类之后执行,完成收尾工作,例如断开数据库链接、回收内存资源等
  • 备注:也可以通过在fixture函数中通过yield实现setup和teardown功能

运行pytest会导致六个不同的退出代码

  • 退出码0 所有测试均已收集并成功通过
  • 退出代码1 测试已收集并运行,但有些测试失败
  • 退出代码2 测试执行被用户中断
  • 退出代码3 执行测试时发生内部错误
  • 退出代码4 pytest命令行用法错误
  • 退出代码5 没有收集测试

要在第一个(N)次失败后停止测试过程

pytest -x           # stop after first failure
pytest --maxfail=2  # stop after two failures

在模块中运行测试

pytest test_mod.py

在目录中运行测试

pytest testing/

通过关键字表达式运行测试

pytest -k "MyClass and not method"

这将运行包含与给定的字符串表达式(不区分大小写)匹配的名称的测试,其中可以包括使用文件名,类名和函数名作为变量的Python运算符。上面的示例将运行TestMyClass.test_something 但不会运行TestMyClass.test_method_simple

按节点ID运行测试

每个收集的测试都分配有一个唯一的nodeid名称,该名称由模块文件名后跟说明符(例如类名,函数名和参数化参数)组成,并用::字符分隔。

要在模块中运行特定的测试,请执行以下操作:

pytest test_mod.py::test_func

在命令行中指定测试方法的另一个示例:

pytest test_mod.py::TestClass::test_method

通过标记表达式运行测试

pytest -m slow

将运行用@pytest.mark.slow装饰器装饰的所有测试。

从包运行测试

pytest --pyargs pkg.testing

这将导入pkg.testing并使用其文件系统位置来查找并运行测试。

修改Python回溯打印修改回溯打印的示例:

pytest --tb=long    # 详尽的信息回溯格式
pytest --tb=short   # 较短的回溯格式
pytest --tb=line    # 每次故障仅一行
pytest --tb=native  # Python标准库格式
pytest --tb=no      # 完全没有回溯

设置断点

breakpoint()

分析测试执行持续时间要获取1.0s内最慢的10个测试持续时间的列表:

pytest --durations=10 --durations-min=1.0