py测试
最后修改时间:2023年9月8日IntelliJ IDEA 支持pytest,一个功能齐全的测试框架。
可以使用以下功能:
专门的测试运行者。
测试主题和 pytest 装置的代码完成。
代码导航。
详细的失败断言报告。
支持Python 2.7 和 Python 3.5 及更高版本。
多处理测试执行。
默认情况下,建议的默认测试运行程序是unittest。因此,要使用pytest,您需要首先将其设为默认测试运行程序。
安装 Pytest
转到Python包工具窗口
开始
pytest
在Python包工具窗口的搜索字段中键入内容。在可用的刻度列表中找到该刻度,然后单击“安装”。
安装包后pytest
,IntelliJ IDEA 会检测到它并设置成为默认的项目测试运行程序。您可以随时在项目设置中更改测试运行程序。
警告
为了确保所有pytest特定功能可用,请手动设置测试运行器:点击打开IDE设置并选择Tools | Python Integrated Tools,然后从测试默认运行程序列表中选择pytest。CtrlAlt0S
现在,该 pytest 已设置为默认测试框架,您可以为 Car.py示例创建一个小测试。让我们创建一个 pytest 测试来检查该brake
功能。
创建测试
创建一个 Python项目。
从主菜单中,单击文件|新建,选择Python文件,输入Car.py,然后单击“确定”。
将Car示例复制并粘贴到Car.py文件中。
警告
该应用程序适用于Python 3
class Car: def __init__(self, speed=0): self.speed = speed self.odometer = 0 self.time = 0 def say_state(self): print("I'm going {} kph!".format(self.speed)) def accelerate(self): self.speed += 5 def brake(self): self.speed -= 5 def step(self): self.odometer += self.speed self.time += 1 def average_speed(self): if self.time != 0: return self.odometer / self.time else: pass if __name__ == '__main__': my_car = Car() print("I'm a car!") while True: action = input("What should I do? [A]ccelerate, [B]rake, " "show [O]dometer, or show average [S]peed?").upper() if action not in "ABOS" or len(action) != 1: print("I don't know how to do that") continue if action == 'A': my_car.accelerate() elif action == 'B': my_car.brake() elif action == 'O': print("The car has driven {} kilometers".format(my_car.odometer)) elif action == 'S': print("The car's average speed was {} kph".format(my_car.average_speed())) my_car.step() my_car.say_state()
在编辑器中,将插入符号放在
brake
方法声明处。执行以下操作之一:
前往导航 | 测试。
从上下文菜单中,选择转到| 测试。
按。CtrlShift0T
IntelliJ IDEA 显示可用测试的列表。
单击创建新测试。
“创建测试”对话框打开。
在“创建测试”对话框中,指定以下设置:
目标目录,将在其中生成新的测试类。
测试文件的名称(在我们的示例中为test_car_pytest.py)以及测试类的名称(如果需要)。
选中要包含在测试类中的方法旁边的复选框。
请注意,如果将插入符号放在方法中,则列表中仅包含该方法名称。另外,请注意命名约定:测试方法有前缀
test
。对于具有此类前缀的所有方法,“运行测试”图标将出现在编辑器装订线中。
准备好后单击“确定”。IntelliJ IDEA 在指定位置生成测试文件。
IntelliJ IDEA 使用测试方法模板自动生成测试文件。将模板代码替换为将初始速度值设置为 50 的代码
Car
,并在函数执行后检查速度是否正确设置为 45brake()
。from Car import Car def test_car_brake(): car = Car(50) car.brake() assert car.speed == 45
请注意,IntelliJ IDEA 会识别测试主题并提供Car
类实例的完成。
尽管pytest 不支持上下文菜单的“转到测试主题”和“转到测试”命令,但您可以使用“转到声明”命令导航到Car.py中的测试代码。
运行测试
点击运行测试:
请注意,IntelliJ IDEA 会自动创建 pytest运行/调试配置:
选择Run pytest for test_car_pytest来执行测试。
检查测试结果:
笔记
要管理 pytest 生成的测试输出,请按打开 IDE 设置并选择Advanced Settings,然后选择Pytest: don't add "--no-header --no-summary -q"复选框在Python部分中。CtrlAlt0S
将语句更改
assert
为以下内容:assert my_car.speed == 4599
。重新运行测试以评估断言失败报告:
请注意,pytest 提供了有关失败的明确报告。
使用 pytest夹具,您可以创建可以在测试模块中重复使用的小型测试单元。您所需要做的就是用 标记可重复使用的单元@pytest.fixture
。
使用夹具
按如下方式修改您的
Car
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()
是一个固定函数,它创建一个Car
速度值等于 50 的实例。它用于test_car_accelerate
验证test_car_brake
类中相应函数的正确执行Car
。请注意,该
my_car
装置与其他标准 pytest 装置(例如tempdir
.单击任一图标,或运行整个测试模块。
scope
您可以使用fixture函数的参数在测试之间共享fixture实例。有关 pytest 装置的更多信息,请参阅pytest 装置文档。
您可能希望对预定义的数据集运行测试。IntelliJ IDEA 支持通过 pytest 实现的测试参数化@pytest.mark.parametrize
。
应用参数化
让我们创建一组速度值来测试
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
请注意,IntelliJ IDEA 会检测新创建的参数并将它们添加到完成列表中。
运行该功能的测试
car.brake()
。您应该期待以下测试报告:
您还可以运行函数测试,car.accelerate()
以确保除了 55 之外的所有速度值都失败。有关参数化测试的更多信息,请参阅pytest 文档。
如果您使用 IntelliJ IDEA 旗舰版,除了上述功能之外,您还可以通过pytest_bdd使用行为驱动开发(BDD) 。当您需要使用 Gherkin 语言快速记录测试并利用 pytest 的有益功能(例如fixture
.
实施测试场景
让我们修改
Car
示例以验证汽车的速度。将以下函数添加到Car.py文件中:def speed_validate(self): return self.speed <= 160
接下来,在您的项目中启用pytest-bdd。在“设置”对话框 ( ) 中,导航至“语言和框架”| BDD,然后从首选 BDD 框架列表中选择pytest-bdd。CtrlAlt0S
创建.feature文件以使用 Gherkin 语言记录 BDD 场景。右键单击项目根目录并选择新建 | 小Cucumber特征文件。在打开的对话框中,指定car.feature作为文件名,然后单击“确定”。
将以下场景添加到car.feature文件中:
Feature: Speed Scenario: Valid speed Given Speed is less than 160 When Accelerated Then Speed is valid Scenario: Invalid speed Given Speed is more than 160 When Accelerated Then Speed is invalid
这两种情况都验证了汽车的速度。当速度不超过 160 的值时,该速度被认为是有效的。请注意,场景步骤被突出显示,因为它们此时尚未定义。
IntelliJ IDEA 可以快速生成整个功能文件的步骤定义。将插入符号放在任意突出显示的步骤处,单击,然后创建选择所有步骤定义。在打开的对话框中,指定测试文件的名称(应以test起始),从文件类型列表中选择Python (pytest-bdd),然后根据需要修改默认文件位置。AltEnter
检查test_car_pytest_bdd_fixture.py文件。它包含
import
每个场景步骤的所有必要的语句和定义。让我们修改测试文件以对对象使用 pytest 夹具
Car
并添加更多测试逻辑:from pytest_bdd import scene,给定,when,然后 import pytest from Car import Car @pytest.fixture def my_car(): return Car() @scenario('car.feature', '有效速度') def test_speed_valid(): pass @ scene('car.feature', '无效速度') def test_speed_invalid(): pass @given("速度小于160") def set_valid_speed(my_car): my_car.speed = 50 @given("速度大于160 ") def set_invalid_speed(my_car): my_car.speed = 100 @when("Accelerated") def car_accelerate(my_car): my_car.accelerate() @then("有效速度") def success(my_car): assert my_car.speed_validate () @then ("速度无效") def failed(my_car): 断言不是 my_car.speed_validate()
通过创建相应的运行/调试配置来运行测试。您还可以使用安装订线中的“运行”图标来运行任一方案。
检查运行测试结果。
在我们的示例中,我们有
test_speed_valid
测试通过和test_speed_invalid
测试失败。
笔记
默认情况下,IntelliJ IDEA 提供
expected == actual
断言。要更改断言参数的顺序,请按打开 IDE 并选择“高级设置”,然后选择“Python”部分中的“交换 Pytest 中实际断言和预期断言的顺序”复选框。CtrlAlt0S
感谢您的反馈意见!