Pytest
PyCharm 支持 pytest ,这是一个功能全面的测试框架。
以下功能可用:
专用测试运行器。
测试对象和 pytest fixtures 的代码补全。
代码导航。
详细的断言失败报告。
支持 Python 2.7 和 Python 3.5 及更高版本。
多进程测试执行。
默认情况下,建议的默认测试运行器是 unittest。 因此,要使用 pytest,您需要先将其设置为默认测试运行器。
安装 Pytest
转到 Python 软件包 工具窗口
在 Python 软件包 工具窗口的 搜索 字段中开始输入
pytest。 在可用包列表中找到该包并点击 安装。
一旦安装了 pytest 包,PyCharm 会检测到它并将其设置为默认项目测试运行器。 您可以随时在项目设置中 更改测试运行器。
现在,pytest 已设置为默认测试框架,您可以为 Car 类 创建一个小测试。 让我们创建一个 pytest 测试来检查 brake 函数。
创建测试
创建一个 Python 项目。
在主菜单中,转到 文件|新建 ,选择 Python 文件 ,输入 car.py ,然后点击 确定。
将 Car 类复制并粘贴到 car.py 文件中。
在编辑器中,将插入点放在
brake方法声明处。请执行以下操作之一:
转到 。
从上下文菜单中选择 。

按下 Ctrl+Shift+T。
PyCharm 显示可用测试的列表。

点击 创建新测试。
创建测试 对话框将打开。

在 创建测试 对话框中,指定以下设置:
目标目录,即新测试类将生成的位置。
测试文件的名称(在我们的示例中为 test_car.py ),以及测试类的名称(如果需要)。
选中要包含在测试类中的方法旁边的复选框。
请注意,如果您将插入点放在某个方法内,则仅该方法名称会包含在列表中。 另外,请注意命名约定:测试方法具有
test前缀。 运行测试 图标将出现在编辑器边栏中,标记所有具有此前缀的方法。
请点击 确定 完成准备。 PyCharm 在指定位置生成测试文件。
PyCharm 会自动生成包含测试方法模板的测试文件。 将模板代码替换为以下代码:将
Car的初始速度值设置为 50,并检查在执行brake()函数后速度是否正确设置为 45。from car import Car def test_car_brake(): car = Car(50) car.brake() assert car.speed == 45
请注意,PyCharm 能识别测试对象,并为 Car 类的实例提供补全功能。

尽管上下文菜单中的 转到测试对象 和 转到测试 命令不支持 pytest,您仍可以通过使用 转到声明 Ctrl+B 命令导航到 car.py 中的被测试代码。
运行测试
点击
运行测试:

请注意,PyCharm 会自动创建一个 pytest Run/Debug 配置:

选择 为 test_car_pytest 运行 pytest 执行测试。
检查测试结果:

将
assert语句更改为以下内容:assert my_car.speed == 4599。重新运行测试以评估断言失败报告:

请注意,pytest 提供了关于失败的明确报告。
使用 pytest fixtures ,您可以创建可在测试模块中重复使用的小型测试单元。 您只需使用 @pytest.fixture 标记一个可重用单元。
使用 fixtures
将您的 pytest 测试修改为以下内容:
import pytest from car import Car @pytest.fixture def my_car(): return Car(50) def test_car_accelerate(my_car): my_car.accelerate() assert my_car.speed == 55 def test_car_brake(my_car): my_car.brake() assert my_car.speed == 45my_car()是一个 fixture 函数,它创建一个速度值为 50 的Car实例。 它用于test_car_accelerate和test_car_brake中,以验证Car类中相应函数的正确执行。请注意,
my_carfixture 会与其他标准 pytest fixtures(如tempdir)一起添加到代码补全列表中。点击任意
图标,或运行整个测试模块。
您可以通过使用 fixture 函数的 scope 参数启用跨测试共享 fixture 实例。 有关 pytest fixtures 的更多信息,请参阅 pytest fixtures 文档。
您可能希望在预定义的数据集上运行测试。 PyCharm 支持通过 @pytest.mark.parametrize 在 pytest 中实现的测试参数化。
应用参数化
让我们创建一组速度值来测试
car.accelerate和car.brake函数:speed_data = {45, 50, 55, 100}将测试代码修改为以下内容:
import pytest from car import Car speed_data = {45, 50, 55, 100} @pytest.mark.parametrize("speed_brake", speed_data) def test_car_brake(speed_brake): car = Car(50) car.brake() assert car.speed == speed_brake @pytest.mark.parametrize("speed_accelerate", speed_data) def test_car_accelerate(speed_accelerate): car = Car(50) car.accelerate() assert car.speed == speed_accelerate请注意,PyCharm 会检测到新创建的参数,并将其添加到补全列表中。

运行
car.brake()函数的测试。 您应该预期以下测试报告:
您还可以运行 car.accelerate() 函数的测试,以确保它在所有速度值(除了 55)上都失败。 有关参数化测试的更多信息,请参阅 pytest 文档。