单元测试是构建可靠软件的基础。测试类型多种多样,但单元测试最为重要。单元测试使您可以放心地将经过充分测试的代码片段作为基本单元,并在构建程序时依赖它们。它们扩展了您对可信代码的储备,超越了语言内置功能和标准库的范围。此外,Python 对编写单元测试提供了强大的支持。
在深入探讨所有原则、启发式方法和指南之前,让我们先来看一个实际的单元测试示例。
创建一个名为 python_tests 的新目录,并添加两个文件:
通过添加 init.py 文件,将该目录设为 Python 包。文件的结构应如下所示:
<code>python_tests/ -__init__.py - car.py - test_car.py</code>
car.py 文件将用于编写我们在此示例中使用的自动驾驶汽车程序的逻辑,而 test_car.py 文件将用于编写所有测试。
car.py 文件内容:
class SelfDrivingCar: def __init__(self): self.speed = 0 self.destination = None def _accelerate(self): self.speed += 1 def _decelerate(self): if self.speed > 0: self.speed -= 1 def _advance_to_destination(self): distance = self._calculate_distance_to_object_in_front() if distance < 1: # 假设距离单位为米 self.stop() elif distance < 5: self._decelerate() elif self.speed < self._get_speed_limit(): self._accelerate() def _has_arrived(self): pass # 需要实现到达目的地判断逻辑 def _calculate_distance_to_object_in_front(self): pass # 需要实现计算前方物体距离的逻辑 def _get_speed_limit(self): pass # 需要实现获取速度限制的逻辑 def stop(self): self.speed = 0 def drive(self, destination): self.destination = destination while not self._has_arrived(): self._advance_to_destination() self.stop()
这是一个针对 TestCase 类的单元测试。如下所示,获取 unittest 模块。
from unittest import TestCase
然后,您可以重写 unittest 测试框架提供的 unittest.main 模块,方法是在测试文件的底部添加以下测试脚本。
if __name__ == '__main__': unittest.main()
继续并在 test_car.py 文件的底部添加测试脚本,如下所示。
import unittest from car import SelfDrivingCar class SelfDrivingCarTest(unittest.TestCase): def setUp(self): self.car = SelfDrivingCar() def test_stop(self): self.car.speed = 5 self.car.stop() self.assertEqual(0, self.car.speed) self.car.stop() self.assertEqual(0, self.car.speed) if __name__ == '__main__': unittest.main(verbosity=2)
要运行测试,请运行 Python 程序:
python test_car.py
您应该看到以下输出:
<code>test_stop (__main__.SelfDrivingCarTest) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.000s OK</code>
另一种方法,也是最简单的方法,是测试发现。此选项仅在 Python 2.7 中添加。在 2.7 之前,您可以使用 nose 来发现和运行测试。Nose 还有一些其他优点,例如运行测试函数而无需为测试用例创建类。但就本文而言,让我们坚持使用 unittest。
顾名思义,-v 标志:
SelfDrivingCarTest。
有几个标志可以控制操作:
python -m unittest -h
测试覆盖率是一个经常被忽视的领域。覆盖率是指您的测试实际上测试了多少代码。例如,如果您有一个带有 if 语句的函数,则需要编写测试来覆盖 if 语句的真值和假值分支。理想情况下,您的代码应该在一个包中。每个包的测试应该在包的同级目录中。在测试目录中,应该为包的每个模块提供一个名为 unittest 模块的文件。
单元测试是可靠代码的基础。在本教程中,我探讨了单元测试的一些原则和指南,并解释了几个最佳实践背后的原因。您构建的系统越大,单元测试就越重要。但是单元测试是不够的。大型系统还需要其他类型的测试:集成测试、性能测试、负载测试、渗透测试、验收测试等。
此文章已更新,并包含 Esther Vaati 的贡献。Esther 是 Envato Tuts 的软件开发人员和撰稿人。
以上是在Python中编写专业的单位测试的详细内容。更多信息请关注PHP中文网其他相关文章!