PyCharm 2025.3 Help

pytest

PyCharm 支持 pytest ,一个功能完备的测试框架。

提供以下功能:

  • 专用的测试运行器。

  • 针对被测对象和 pytest fixture 的代码补全。

  • 代码导航。

  • 详细的断言失败报告。

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

  • Multiprocessing 测试执行。

默认情况下,建议的默认测试运行器为 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 标记可重用单元即可。

使用 fixture

  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 fixture 一起添加到代码补全列表中,例如 tempdir

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

您可以通过 fixture 函数的 scope 参数启用在测试之间共享 fixture 实例。 有关 pytest fixture 的更多信息,请参阅 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 函数,3 个测试失败,1 个测试通过

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

最后修改日期: 2025年 12月 2日