返回介绍

测试

发布于 2024-05-30 23:22:17 字数 6802 浏览 0 评论 0 收藏 0

单元测试

Python 内置的 unittest 模块用于单元测试。

编写单元测试:
编写单元测试时,我们需要编写一个测试类,并从 unittest.TestCase 继承。在测试类中可以编写多个测试方法(也叫测试用例)。
以 test 开头的方法就是测试方法,不以 test 开头的方法不被认为是测试方法,测试的时候不会被执行。
unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。
最常用的断言就是 assertEqual()

self.assertEqual(abs(-1), 1) # 断言函数返回的结果与 1 相等

另一种重要的断言就是期待抛出指定类型的 Error,例如通过 d['empty'] 访问不存在的 key 时,断言会抛出 KeyError:

with self.assertRaises(KeyError):
    value = d['empty']

运行单元测试:
最简单的运行方式是在代码中写unittest.main()

if __name__ == '__main__':
    unittest.main()

另一种方法是在命令行通过参数 -m unittest 直接运行单元测试:

$ python3 -m unittest testfile1 testfile2 testfile3

这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。

setUp 与 tearDown:
可以在单元测试中编写两个特殊的 setUp()tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。
setUp()方法中进行测试前的初始化工作, tearDown()方法中执行测试后的清除工作。

例:

import unittest
class My:   #待测试类
    def sum(self, x, y):
        return x + y
    def sub(self, x, y):
        return x - y
class TestMy(unittest.TestCase):  #测试类
    #初始化工作
    def setUp(self):
        self.my = My()
    #退出清理工作
    def tearDown(self):
        pass
    #具体的测试用例,一定要以test开头
    def test_1(self):
        self.assertEqual(self.my.sum(1,2), 3)
    #具体的测试用例,一定要以test开头
    def test_2(self):
        self.assertEqual(self.my.sub(1,2), -1)
if __name__ == '__main__':
   unittest.main()   #启动测试

测试结果:打印一个点表示一个通过,F表示一个fail.

文档测试

Python 内置的“文档测试”( doctest)模块可以直接提取注释中的代码并执行测试。
doctest 严格按照 Python 交互式命令行的输入和输出来判断测试结果是否正确。

import doctest
class My:
    '''
    Example:
    >>> a = [1,2,3]
    >>> a
    [1, 2, 3]
    '''
    pass
if __name__ == '__main__':
    doctest.testmod()

如果期望结果和执行结果不一致,则会报错;如果正确,则什么输出也没有。

注:doctest 非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含 doctest 的注释提取出来。用户看文档的时候,同时也看到了 doctest。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文