PyCharm 2025.2 Help

Pytest

PyCharm 支持 pytest ,这是一个功能全面的测试框架。

以下功能可用:

  • 专用测试运行器。

  • 测试对象和 pytest fixtures 的代码补全。

  • 代码导航。

  • 详细的断言失败报告。

  • 支持 Python 2.7 和 Python 3.5 及更高版本。

  • 多进程测试执行。

默认情况下,建议的默认测试运行器是 unittest。 因此,要使用 pytest,您需要先将其设置为默认测试运行器。

安装 Pytest

  1. 转到 Python 软件包 工具窗口

  2. Python 软件包 工具窗口的 搜索 字段中开始输入 pytest。 在可用包列表中找到该包并点击 安装

    正在安装 Pytest

一旦安装了 pytest 包,PyCharm 会检测到它并将其设置为默认项目测试运行器。 您可以随时在项目设置中 更改测试运行器

现在,pytest 已设置为默认测试框架,您可以为 Car 创建一个小测试。 让我们创建一个 pytest 测试来检查 brake 函数。

创建测试

  1. 创建一个 Python 项目

  2. 在主菜单中,转到 文件|新建 ,选择 Python 文件 ,输入 car.py ,然后点击 确定

  3. Car 类复制并粘贴到 car.py 文件中。

  4. 在编辑器中,将插入点放在 brake 方法声明处。

  5. 请执行以下操作之一:

    • 转到 导航 | 测试

    • 从上下文菜单中选择 转到 | 测试

      前往测试
    • 按下 Ctrl+Shift+T

    PyCharm 显示可用测试的列表。

    为 pytest 创建新测试
  6. 点击 创建新测试

    创建测试 对话框将打开。

    为 brake 方法创建一个 Python 测试

    创建测试 对话框中,指定以下设置:

    • 目标目录,即新测试类将生成的位置。

    • 测试文件的名称(在我们的示例中为 test_car.py ),以及测试类的名称(如果需要)。

    • 选中要包含在测试类中的方法旁边的复选框。

      请注意,如果您将插入点放在某个方法内,则仅该方法名称会包含在列表中。 另外,请注意命名约定:测试方法具有 test 前缀。 运行测试 图标将出现在编辑器边栏中,标记所有具有此前缀的方法。

  7. 请点击 确定 完成准备。 PyCharm 在指定位置生成测试文件。

  8. 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 中的被测试代码。

运行测试

  1. 点击 运行测试 运行测试:

    运行该测试
  2. 请注意,PyCharm 会自动创建一个 pytest Run/Debug 配置:

    为 pytest 提供的建议运行/调试配置

    选择 为 test_car_pytest 运行 pytest 执行测试。

  3. 检查测试结果:

    Pytest 运行
  4. assert 语句更改为以下内容: assert my_car.speed == 4599

  5. 重新运行测试以评估断言失败报告:

    断言失败报告

    请注意,pytest 提供了关于失败的明确报告。

使用 pytest fixtures ,您可以创建可在测试模块中重复使用的小型测试单元。 您只需使用 @pytest.fixture 标记一个可重用单元。

使用 fixtures

  1. 将您的 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 == 45

    my_car() 是一个 fixture 函数,它创建一个速度值为 50 的 Car 实例。 它用于 test_car_acceleratetest_car_brake 中,以验证 Car 类中相应函数的正确执行。

    请注意, my_car fixture 会与其他标准 pytest fixtures(如 tempdir )一起添加到代码补全列表中。

  2. 点击任意 运行测试 图标,或运行整个测试模块。

您可以通过使用 fixture 函数的 scope 参数启用跨测试共享 fixture 实例。 有关 pytest fixtures 的更多信息,请参阅 pytest fixtures 文档

您可能希望在预定义的数据集上运行测试。 PyCharm 支持通过 @pytest.mark.parametrize 在 pytest 中实现的测试参数化。

应用参数化

  1. 让我们创建一组速度值来测试 car.acceleratecar.brake 函数: speed_data = {45, 50, 55, 100}

  2. 将测试代码修改为以下内容:

    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 会检测到新创建的参数,并将其添加到补全列表中。

    pytest.mark.parametrize 的代码补全
  3. 运行 car.brake() 函数的测试。 您应该预期以下测试报告:

    car.brake 函数的三个测试失败,一个测试通过

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

最后修改日期: 2025年 9月 26日