Pytest 是 Python 的一种单元测试框架,与 Python 自带的 unittest 测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高。
Pytest 是一个成熟的全功能的 Python 测试工具,可以帮助你写出更好的程序,让我们很方便的编写测试用例。
适合从简单的单元到复杂的功能测试。有很多的第三方插件可以自定义扩展,并且支持 Allure,生成可视化的测试报告和测试结果,并能输出 log 信息。
Pytest官网,简单来说,就是你可以写一个测试的程序,尤其在实现项目之前,这样的好处是能够在一开始的时候(不知道代码逻辑之前)将目标的输出确认好,避免写出为了通过测试而测试的测试。
为什么要写测试?谁想进行手动测试?
当你修复错误或添加新功能时,测试可以验证你在途中有没有破坏任何内容
如果你有明确的要求,则可以针对每个要求进行匹配测试
你不必害怕重构
测试记录了你的实施 - 它们向其他人展示了你的实施案例
这份清单无穷无尽......
简而言之,TDD的基本思想是在编写实际实现之前编写测试。也许这种方法最重要的好处是开发人员专注于编写与程序应该做的匹配的测试。如果测试是在实际实施之后编写的,那么测试的风险很高,这些测试只是为已经编写的逻辑显示绿灯。
测试是现代敏捷软件开发中的重要的一环,这就是为什么在Python学习路径中尽早开始思考TDD的重要性。
TDD的工作流程可归纳如下:为你要实施的更改/功能/错误修复添加测试用例
运行所有测试并检查新测试是否失败
实施所需的更改
运行测试并验证是否全部通过
重构
在Notebook中运行pytest
这些是在Jupyter单元格中运行pytest所需的步骤。您可以将此单元格的内容复制到包含测试的Notebook中。
# Let's make sure pytest and ipytest packages are installed
# ipytest is required for running pytest inside Jupyter notebooks
import sys
!{sys.executable} -m pip install pytest
!{sys.executable} -m pip install ipytest
import ipytest.magics
import pytest
# Filename has to be set explicitly for ipytest
__file__ = 'testing1.ipynb'
Pytest测试用例
让我们考虑一下sum_of_three_numbers我们想要编写测试的函数。
如函数
#This would be in your e.g. implementation.py
def sum_of_three_numbers (num1 , num2 , num3 )中:
return num1 + num2 + num3
Pytest测试用例实际上与您在练习中看到的非常相似。通过将每个练习划分为三个单元格,大多数练习的结构类似于pytest测试用例:设置测试中使用的变量
你的实现
使用断言验证你的实现是否符合要求
请参阅下面的示例测试用例,以了解练习与测试用例的常见结构之间的相似之处。
%%run_pytest[clean]
# Mention this at the top of cells which contain test(s)
# This is only required for running pytest in Jupyter notebooks
# This would be in your test_implementation.py
def test_sum_of_three_numbers():
# 1. Setup the variables used in the test
num1 = 2
num2 = 3
num3 = 5
# 2. Call the functionality you want to test
result = sum_of_three_numbers(num1, num2, num3)
# 3. Verify that the outcome is expected
assert result == 10
现在继续更改该行assert result == 10,使断言无法看到失败测试的输出。
PS:Pytest有一个很重要的功能叫做Fixture:fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
参考文献: