首页 > 后端开发 > Python教程 > 在Python中编写专业的单位测试

在Python中编写专业的单位测试

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-03-05 10:46:08
原创
382 人浏览过

Write Professional Unit Tests in Python

单元测试是构建可靠软件的基础。测试类型多种多样,但单元测试最为重要。单元测试使您可以放心地将经过充分测试的代码片段作为基本单元,并在构建程序时依赖它们。它们扩展了您对可信代码的储备,超越了语言内置功能和标准库的范围。此外,Python 对编写单元测试提供了强大的支持。

运行示例

在深入探讨所有原则、启发式方法和指南之前,让我们先来看一个实际的单元测试示例。

创建一个名为 python_tests 的新目录,并添加两个文件:

  • car.py
  • test_car.py

通过添加 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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板