Fan*_*ver 4 python python-unittest
这是我第一次在学校作业中使用 Python 的单元测试。我基本上有一个 Circle 对象,我在其中使用 pyunit 来确保数据正确存储。
我注意到 Python 只计算测试用例的方法数量,而不是断言语句的数量。
例如,我想测试方法是否正常工作,尽管有 4 个断言语句,Python 仅将以下内容算作 2 个测试。这确实让我措手不及,因为 Java 的 JUnit 会计算断言语句的数量。
def test_xcrd(self):
self.assertTrue(self.point.xcrd() == 1)
self.assertFalse(self.point.xcrd() == 5)
def test_ycrd(self):
self.assertTrue(self.point.ycrd() == 2)
self.assertFalse(self.point.ycrd() == 10)
Run Code Online (Sandbox Code Playgroud)
python 中的“规范”是什么?每个方法应该只有一个断言语句吗?
Python 的unittest
包允许您使用单独的方法构建单元测试,就像您注意到的那样。当您想要测试密切相关且不需要单独的单元测试的事物时,这非常有用。
unittest
测试从子类化开始unittest.Test
,然后向其添加方法。因此,您可以在不同的单元测试之间添加几个层分离,这些单元测试的相关性较低。
Python 文档中的一个示例演示了 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()
Run Code Online (Sandbox Code Playgroud)
您可以在这里观察到很多事情:
TestStringMethods
是单独的单元测试。test_isupper
两者test_split
都包含两个断言,因为它们密切相关。为其中存在的两个断言添加单独的测试test_isupper
会给代码增加大量的膨胀,并且可能会导致非常奇怪的问题。例如,如果str.isupper()
以奇怪的方式中断,则覆盖此单个函数的单个单元测试就会中断。"FOO"
但是,如果和 的两个测试"Foo"
是分开的,则一个测试可能会通过,而另一个会失败。因此,测试单个函数的功能最好保留在具有多个断言的单个单元测试中。
方法也同样test_split
。检查是否str.split()
有效和检查是否引发 aTypeError
密切相关,因此最好在代码中保持紧密联系。
所以,回到你的问题:每个方法可以(有时应该)有多个断言,因为它会导致代码更简单、更清晰,并且更少混乱。引用《Python 之禅》(通过import this
在 python shell 中运行发现):“简单胜于复杂”。因此,通过将类似的断言分组到单个方法中,保持单元测试简单且结构化。
归档时间: |
|
查看次数: |
4235 次 |
最近记录: |