这是我第一次在学校里玩Python的unittest。我基本上有一个Circle对象,在这里我使用pyunit来确保数据存储正确。在
我注意到Python只计算作为测试用例的方法的数量,而不是assert语句的数量。在
例如,我想测试方法是否正常工作,Python只将以下内容计算为2个测试,尽管有4个assert语句。它确实让我措手不及,因为使用Java的JUnit,它将计算assert语句的数量。在
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)
python中的“规范”是什么?每个方法应该只有一个assert语句吗?在
Python的
unittest
包允许您像您所注意到的那样,在不同的方法中构造单元测试。这在需要测试非常密切相关且不需要单独的单元测试的情况下非常有用。在unittest
测试首先将unittest.Test
子类化,然后向其添加方法。因此,您可以在不同的单元测试之间添加多个层分离,这些单元测试之间的关联性较小。在Python Docs中的一个示例演示了Python单元测试的最佳实践:
在这里你可以观察到很多事情:
TestStringMethods
的三种方法是独立的单元测试。在test_isupper
和{test_isupper
中存在的两个断言添加单独的测试将给代码添加大量膨胀,并且可能导致非常奇怪的问题。在例如,如果
str.isupper()
以一种奇怪的方式中断,那么覆盖这个单一函数的单个unittest就会中断。但是,如果"FOO"
和"Foo"
的两个测试是分开的,那么一个测试可能通过,另一个测试失败。因此,测试单个函数的功能最好保存在具有多个断言的单个单元测试中。在这同样适用于
test_split
方法;检查str.split()
是否工作以及检查它是否引发了TypeError
是密切相关的,因此最好在代码中保持紧密联系。在所以,回到你的问题上来:每个方法可以(有时应该)有多个assert,因为它会导致更简单、更清晰的代码和更少的混乱。引用“Python的Zen”(在pythonshell中运行
import this
可以发现):“简单比复杂好”。因此,通过在一个方法中对相似的断言进行分组,使您的单元测试保持简单和结构化。在你的问题的答案是python中的“规范”是什么?每个方法只能有一个assert语句吗?“”是“不”。有些人可能会说“是”,但CPython核心开发人员,包括我在内,经常在测试方法中使用多个断言。看看
Lib/test
中的test_xyz
文件(如果您的安装包含该目录)。在确实,一个方法应该测试一个单元,甚至一个单元的一个行为。在
相关问题 更多 >
编程相关推荐