pytest
PyCharm 支持 pytest ,一个功能完备的测试框架。
提供以下功能:
专用的测试运行器。
针对被测对象和 pytest fixture 的代码补全。
代码导航。
详细的断言失败报告。
支持 Python 2.7 以及 Python 3.5 及更高版本。
Multiprocessing 测试执行。
默认情况下,建议的默认测试运行器为 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 标记可重用单元即可。
使用 fixture
按如下方式修改您的 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 fixture 一起添加到代码补全列表中,例如tempdir。点击任一
图标,或运行整个测试模块。
您可以通过 fixture 函数的 scope 参数启用在测试之间共享 fixture 实例。 有关 pytest fixture 的更多信息,请参阅 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 文档。