Python中的单元测试?

4 投票
4 回答
983 浏览
提问于 2025-04-15 20:41

嘿,我是Python的新手,最近在理解Python中的单元测试这个概念时遇到了一些困难。

我之前是用Java的,所以单元测试对我来说是有意义的,因为在Java中,你确实有一个单元——一个类。但是Python中的类和Java中的类不完全一样,而我使用Python的方式更像是一种脚本语言,偏向于函数式编程,而不是面向对象编程。那么在Python中,你到底应该“单元测试”什么呢?是一个流程吗?

谢谢!

4 个回答

5

如果你在做函数式编程,那么你关注的单位就是“函数”。我建议你对你的函数进行单元测试。

5

如果你想快速简单地进行测试,可以看看 doctests

写测试的时候,你可以在文档字符串里放一些看起来像交互式解释器会话的内容:

def my_function(n):
    """Return n + 5

    >>> my_function(500)
    505"""
    return n + 5

要运行测试,你需要导入 doctest,然后运行 doctest.testmod(),这样就会运行模块里的所有 doctests。你也可以用 doctest.testfile("...") 来运行其他文件里的所有测试。

如果你查看 doctests 的文档,你会发现可以让测试期待异常、列表等输出——也就是解释器会输出的任何内容,还有一些简写的通配符。

这是在 Python 模块中写测试的快速方法,不需要很多额外的代码,个人觉得这样更新测试也更简单(测试就写在函数里!)。不过我觉得它们看起来有点丑。

9

Python有一个我很喜欢的单元测试模块。你也可以阅读Dive Into Python中的单元测试部分。

这里有一个来自(链接的)文档的基本示例:

import random
import unittest

class TestSequenceFunctions(unittest.TestCase):

    def setUp(self):
        self.seq = range(10)

    def test_shuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))

        # should raise an exception for an immutable sequence
        self.assertRaises(TypeError, random.shuffle, (1,2,3))

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

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

撰写回答