Python的unittest
软件包允许您使用单独的方法构建单元测试,就像您注意到的一样。如果您想测试非常密切相关的事物并且不需要单独的单元测试,这很有用。
unittest
测试通过子类别unittest.Test
开始,然后向其中添加方法。因此,您可以在不同的单元测试之间添加多个图层分隔,这些图层之间的关联更少。
从Python Docs一个例子说明了什么被认为是对Python的单元测试最佳实践:
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
有许多的东西,你可以在这里看到:
- 的三种方法
TestStringMethods
是独立的单元测试。
test_isupper
和test_split
都包含两个断言,因为它们密切相关。为test_isupper
中的两个断言添加单独的测试会增加代码的膨胀量,并且可能导致非常奇怪的问题。
例如,如果str.isupper()
会以奇怪的方式破坏,则覆盖该单一函数的单个单元测试将会中断。但是,如果"FOO"
和"Foo"
的两个测试是分开的,则一个测试可能通过,另一个测试失败。因此,测试单个函数的功能最好保存在具有几个断言的单个单元测试中。
这同样适用于test_split
方法;检查str.split()
是否正常工作并检查它是否产生TypeError
密切相关,因此最好在代码中保持密切相关。
所以,回到你的问题:每个方法都可以(有时应该)多于一个断言,因为它导致更简单,更清晰的代码,并且更少混淆。引用“Python的禅”(通过在python shell中运行import this
找到):“简单胜于复杂”。因此,通过用单一方法分组类似的断言,让你的单元测试变得简单和结构化。
“与Java的JUnit一样,它会计算断言语句的数量,而不是” - 什么?从何时起? – user2357112
在过去的经验中,只要我有@Test我想测试的上述方法,相应方法中的所有断言语句都会显示在Eclipse的JUnit Testing面板中。例如,一个包含4个以Java编写的断言语句的方法 - 全部四个断言将在Eclipse中显示。 pyunit用Python编写的这些相同的断言,说“Ran 1测试0.001秒,好吧。” –
'pyunit'是第三方测试模块,它与标准库中的CPython自带的'unittest'模块不同。如果你使用'unittest',那么你应该编辑文本来删除'pyunit'和'pyunit'标签。如果您发布了MCVE https://stackoverflow.com/help/mcve,那么您使用的是哪个模块就没有问题。 –