0


Python 高手编程系列六百八十一:达式 Python 标准测试工具

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):这是一个有读写能力的编
程测试工具,它带有交互式使用示例。
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 模块。这可以通过将两个模块放在同一个包中,通过将测试模块显式地添加到 Python 路径来实现。在实践中,
setuptools 的 develop 命令在这里非常有用。
对整个应用程序运行测试的前提是你拥有一个脚本,它可以在所有测试模块中构建测
试活动(test campaign)。unittest 提供了一个 TestSuite 类,可以聚合测试并将它们
作为测试活动运行,只要它们都是 TestCase 或 TestSuite 的实例。
在以往的 Python 中,有这样一个约定,测试模块提供一个 test_suite 函数,该函
数返回一个 TestSuite 实例,当模块被命令提示符调用或被测试运行器使用时,在
__main__部分会调用它,如下所示:
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))
class OtherTests(unittest.TestCase):
def test_true(self):
self.assertTrue(True)
def test_suite():
“”“构建测试套件”“”
suite = unittest.TestSuite()
suite.addTests(unittest.makeSuite(PrimesTests))
suite.addTests(unittest.makeSuite(OtherTests))
return suite
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()函数。
doctest
doctest 是一个模块,它通过从 docstrings 或文本文件中提取片段以交互式提示会话
的形式,重放它们以检查示例输出是否与实际输出相同。
例如,具有以下内容的文本文件可以作为测试运行:
Check addition of integers works as expected::

1 + 1
2
让我们假设这个文档文件存储在以 test.rst 命名的文件中。doctest 模块提供了
一些功能,可以从以下这些文档中提取和运行测试:
import doctest
doctest.testfile(‘test.rst’, verbose=True)
Trying:
1 + 1
Expecting:
2
ok
1 items passed all tests:
1 tests in test.rst
1 tests in 1 items.
1 passed and 0 failed.
Test passed.
TestResults(failed=0, attempted=1)
使用 doctest 有很多优点。
● 包可以通过实例文档化和测试。
● 文档示例始终是最新的。
● 在 doctests 中使用示例编写包有助于维护用户的观点。
然而,文档测试并不能替代单元测试,它们仅应用于在文档中提供可读的示例。换句
话说,当测试涉及底层的事情或着需要复杂的会使文档混淆的测试固件(test fixtures)时,
就不应该使用它们了。
一些 Python 框架(如 Zope)广泛使用文档测试,有时它们会被新手批判。有些
doctests 真的很难阅读和理解,因为示例打破了技术写作的规则之一:它们不能被放
到命令行里直接运行,它们需要广泛的知识。因此,本应该有助于新手的文档真的很难
阅读,因为代码示例是通过 TDD 构建的文档测试,是基于复杂的测试固件或者特定的测
试 API。


本文转载自: https://blog.csdn.net/2301_77888392/article/details/141778599
版权归原作者 杨琴1 所有, 如有侵权,请联系我们删除。

“Python 高手编程系列六百八十一:达式 Python 标准测试工具”的评论:

还没有评论