测试您的第一个 Python 应用程序
最后修改时间:2023 年 11 月 26 日请记住,在第一个教程中您已经创建了第一个 Python 应用程序,在第二个教程中您已经对其进行了调试。现在是时候进行一些测试了。
选择测试运行程序
PyCharm 自动检测安装在Python 解释器上的测试运行程序并使用它来运行测试。如果未安装特定的测试运行程序,PyCharm 将使用unittest。
要在项目设置中明确设置所需的测试运行程序,请按打开 IDE 设置并选择“工具”|“测试运行器”。Python 集成工具,然后从默认测试运行程序列表中选择目标测试运行程序。CtrlAlt0S

有关更多信息,请参阅测试框架。
创建测试
创建测试的一种快速方法是让 PyCharm 将它们从我们想要测试的类中删除。为此,我们需要打开car.py,然后右键单击类的名称,指向Go To,然后选择Test(或直接按):CtrlShift0T

出现一个弹出窗口,建议创建一个新测试:

好的,让我们一起做。我们将测试我们的汽车是否能够加速和制动,所以让我们选择这些复选框:

创建一个新的 Python 测试类:

您可以通过单击类定义旁边的装订线中的图标来运行测试。将自动创建运行/调试配置:


现在我们知道可以运行测试了,让我们开始编写一些实际的测试代码。
编写测试
如何编写单元测试超出了本文的范围。如果您有兴趣了解如何使用“unittest”框架,可以查看他们的文档。
对于我们的示例,让我们使用这些测试:
from unittest import TestCase
from car import Car
class TestCar(TestCase):
def setUp(self):
self.car = Car()
class TestInit(TestCar):
def test_initial_speed(self):
self.assertEqual(self.car.speed, 0)
def test_initial_odometer(self):
self.assertEqual(self.car.odometer, 0)
def test_initial_time(self):
self.assertEqual(self.car.time, 0)
def test_initial_average_speed(self):
self.assertEqual(self.car.average_speed(), 0)
class TestAccelerate(TestCar):
def test_accelerate_from_zero(self):
self.car.accelerate()
self.assertEqual(self.car.speed, 5)
def test_multiple_accelerates(self):
for _ in range(3):
self.car.accelerate()
self.assertEqual(self.car.speed, 15)
class TestBrake(TestCar):
def test_brake_once(self):
self.car.accelerate()
self.car.brake()
self.assertEqual(self.car.speed, 0)
def test_multiple_brakes(self):
for _ in range(5):
self.car.accelerate()
for _ in range(3):
self.car.brake()
self.assertEqual(self.car.speed, 10)
def test_should_not_allow_negative_speed(self):
self.car.brake()
self.assertEqual(self.car.speed, 0)
def test_multiple_brakes_at_zero(self):
for _ in range(3):
self.car.brake()
self.assertEqual(self.car.speed, 0)
运行测试
现在让我们运行测试。右键单击test_сar.py编辑器选项卡并选择运行“Python 测试 in test_car.py”:

这次几乎所有测试都成功通过了:

调试测试
让我们仔细看看测试代码并调试失败的测试。在“运行”工具窗口的左窗格中选择失败的测试,然后在右窗格中找到发生错误的行号:

单击编辑器中的行号设置断点:

接下来,启动调试器会话。为此,右键单击方法处的编辑器背景,然后从上下文菜单中test_initial_average_speed
选择“调试” :

调试工具窗口打开:

单击按钮进入 class
Car
,然后在Debug工具窗口中展开self节点。
调试器突出显示了接下来要执行的行 ( return self.odometer / self.time
),在调试工具窗口中我们可以看到它self.speed
等于 0:

这将导致下一步出现异常,因为除以零是不可能的。让我们通过向类中添加一些代码来解决这个问题Car
。
self.odometer / self.time
在编辑器中选择。选择重构 | 从主菜单或上下文菜单中引入变量,或按。CtrlAlt0V
输入变量的名称,例如
avg_speed
:选择语句
avg_speed = self.odometer / self.time
,按(代码 | 包围),然后选择if向语句添加条件。CtrlAlt0TPyCharm 创建一个存根
if
构造:self.time
如果等于 0,则不应除以。因此,请键入self.time != 0
以指定条件。然后指定当为零
avg_speed
时应等于零。self.time
这是您应该得到的:def average_speed(self): if self.time != 0: avg_speed = self.odometer / self.time else: avg_speed = 0 return avg_speed
切换到test_car.py并再次运行测试:

所有测试均已通过。
自动运行测试
在最后一段中,我们在修复类后手动重新运行测试Car
。如果您想专注于代码,并且只想查看何时解决问题,PyCharm 可以自动为您运行测试。
现在,每次您在项目文件中输入更改时(如之前所做的那样),测试将在无需您干预的情况下运行。
感谢您的反馈意见!