Python中的单元测试?
嘿,我是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()