Python 在标准库中提供了两个主要模块来编写测试。
● unittest(https://docs.python.org/3/library/unittest.html):这是标准库也是最常见
的Python 单元测试框架,它基于Java 的JUnit 框架,最初由Steve Purcell 编写(以
前称为PyUnit)。
● doctest(https://docs.python.org/3/library/doctest.html):这是一个有读写能力的编
程测试工具,它带有交互式使用示例。
1.unittest
unittest 基本上提供了Java 中的Junit 框架的功能。它提供了一个名为TestCase
的基类,它有一组广泛的方法来验证函数调用和语句的输出。
该模块是为编写单元测试而创建的,但是只要测试使用用户接口,验收测试也可以用
它来编写。例如,一些测试框架提供帮助,在unittest 之上驱动工具,如Selenium。
使用unittest 为一个模块编写一个简单的单元测试,这是通过继承TestCase 类并
且使用test 前缀来编写方法来完成的。测试驱动开发原则部分的最后一个例子,如下所示:
import unittest
from primes import is_prime
class MyTests(unittest.TestCase):
def test_is_prime(self):
self.assertTrue(is_prime(5))
self.assertTrue(is_prime(7))
self.assertFalse(is_prime(8))
self.assertFalse(is_prime(0))
self.assertFalse(is_prime(1))
self.assertFalse(is_prime(-1))
self.assertFalse(is_prime(-3))
self.assertFalse(is_prime(-6))
if name == “main”:
unittest.main()
unittest.main()函数是一个通用程序,它允许将整个模块作为一个测试套件执行,
如下所示:
$ python test_is_prime.py -v
test_is_prime (main.MyTests) … ok

Ran 1 test in 0.000s
OK
unittest.main()函数扫描当前模块的上下文,并查找TestCase 类的子类。它实
例化这些子类,然后运行所有以test 作为前缀开头的方法。
一个好的测试套件遵循通用和一致的命名约定。例如,如果primes.py 模块中包含
is_prime 函数,则测试类可以命名为PrimesTests 并放入test_primes.py 文件中,
如下所示:
import unittest
from primes import is_prime
class PrimesTests(unittest.TestCase):
def test_is_prime(self):
self.assertTrue(is_prime(5))
self.assertTrue(is_prime(7))
self.assertFalse(is_prime(8))
self.assertFalse(is_prime(0))
self.assertFalse(is_prime(1))
self.assertFalse(is_prime(-1))
self.assertFalse(is_prime(-3))
self.assertFalse(is_prime(-6))
if name == ‘main’:
unittest.main()
从那里,每次在utils 模块中进行开发,就在test_primes 模块中编写更多的测试。
为了运行测试,test_primes 模块需要在上下文中获得primes 模块。这可以通过unittest.main()
unittest.main()函数是一个通用程序,它允许将整个模块作为一个测试套件执行,
如下所示:
$ python test_is_prime.py -v
test_is_prime (main.MyTests) … ok

Ran 1 test in 0.000s
OK
unittest.main()函数扫描当前模块的上下文,并查找TestCase 类的子类。它实
例化这些子类,然后运行所有以test 作为前缀开头的方法。
一个好的测试套件遵循通用和一致的命名约定。例如,如果primes.py 模块中包含
is_prime 函数,则测试类可以命名为PrimesTests 并放入test_primes.py 文件中,
如下所示:
import unittest
from primes import is_prime
class PrimesTests(unittest.TestCase):
def test_is_prime(self):
self.assertTrue(is_prime(5))
self.assertTrue(is_prime(7))
self.assertFalse(is_prime(8))
self.assertFalse(is_prime(0))
self.assertFalse(is_prime(1))
self.assertFalse(is_prime(-1))
self.assertFalse(is_prime(-3))
self.assertFalse(is_prime(-6))
if name == ‘main’:
unittest.main()
从那里,每次在utils 模块中进行开发,就在test_primes 模块中编写更多的测试。
为了运行测试,test_primes 模块需要在上下文中获得primes 模块。这可以通过if name == ‘main’:
unittest.main(defaultTest=‘test_suite’)
在shell 中运行此模块将打印测试活动输出,如下所示:
$ python test_primes.py -v
test_is_prime (main.PrimesTests) … ok
test_true (main.OtherTests) … ok

Ran 2 tests in 0.001s
OK
在旧版本的Python 中,unittest 模块没有正确的测试发现实用程序,就需要使用前
面的方法。通常,所有测试的运行都是通过一个全局脚本来完成的,该脚本浏览代码树寻
找测试并运行它们。这个过程被称为测试发现(test discovery),将在本章后面继续讨论。
现在,你应该只知道unittest 提供了一个简单的命令,可以从模块和包中发现带有test
前缀的所有测试,如下所示:
$ python -m unittest -v
test_is_prime (test_primes.PrimesTests) … ok
test_true (test_primes.OtherTests) … ok

Ran 2 tests in 0.001s
OK
如果使用上述命令,则不需要手动定义__main__部分并调用unittest.main()函数。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐