Python中的单元测试?

4

嘿 - 我是Python的新手,很难理解Python中的单元测试概念。

我之前学过Java - 所以单元测试很好理解,因为在Java中你有一个单元 - 一个类。但是Python类不一定与Java类相同,而且我使用Python的方式 - 作为脚本语言 - 更多的是函数式编程而不是面向对象编程 - 那么在Python中你要如何进行“单元测试”呢?一个流程吗?

谢谢!


为什么脚本不是一个单元?我不明白你所做的区分。你能解释一下为什么脚本不是一个单元吗? - S.Lott
2
Python可以是面向对象的,除了作者之外,没有任何关于这种语言使它成为一种函数式语言的特点。说其他的话是不正确的。 - manifest
4个回答

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()

貌似 http://diveintopython.org/ 已经无法访问了? - Jonathon Reinhart
确实是这样,我会删除链接。 - Mizipzor
@JonathonReinhart 它并没有消失,只是在 http://diveintopython.net (或者对于 Python 3,在 http://getpython3.com/diveintopython3/)。 - max
@max 谢谢,我已经重新添加了链接。 - Mizipzor

5

如果您需要快速简单的测试,可以查看doctest

为编写测试,您需要在文档字符串中放置类似于交互式解释器会话的内容:

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

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

为了运行测试,您需要导入doctest并运行doctest.testmod(),这将运行模块中的所有doctest。您还可以使用doctest.testfile("...")来运行其他文件中的所有测试。
如果您查看doctest文档,您将发现可以使测试预期异常、列表等——任何解释器可能输出的内容,还有一些通配符缩短长度。
这是在Python模块中编写测试的快速方法,没有很多样板代码,并且在我看来更容易使测试保持最新(测试就在函数中!)。但我也觉得它们有点丑陋。

5
如果你使用函数式编程,那么单位就是函数,我建议对你的函数进行单元测试。

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接