假设我对表单有一个简单的函数:
def square(x):
return x**2
如果我编写了测试正确性的单元测试,那么这样做是否被认为是错误的做法:
def test_square(self):
for _ in range(50):
rand_num = random.uniform(-10,10)
self.assertAlmostEqual(square(rand_num), rand_num**2, msg= "Failed for input: {}".format(rand_num))
从本质上讲,我不是在编写手册用例,而是在某种意义上重写单元测试中的函数?为什么或者为什么这不被认为是好的做法。
我假设还有其他的测试来检查无效的输入和其他东西;我问的是非常具体的测试函数正确性的情况。
发布于 2016-09-19 15:17:11
随机输入几乎不是你想要的。如果您的测试有时成功,但由于测试生成的随机输入不同,而在其他测试上失败,则不会有多大帮助。
您只需要测试最低限度,以确保正确的结果。如果有错误或回归,则根据需要添加其他测试。
这就足够了
def test():
assert square(3) == 9
注意,测试不依赖于任何特定的实现细节(也就是说,它只包括计算出来的9
,而不是3**2
)。通常,您希望您的测试具有尽可能少的依赖关系和复杂性。通常,您尝试一次测试一件事情,而更少的依赖关系意味着您实际上是在测试您想要的东西,而不是与某些依赖项的交互。
如果您注意到一个带有负数的错误,那么您可以添加一个额外的测试。
def test():
assert square(3) == 9
assert square(-3) == 9
通常情况下,人们会在开发完该功能之后添加单元测试,或者在一开始就尝试创建整个单元测试功能。
最好的方法通常是一次测试一个特性,每次添加一个特性,然后一起开发测试和功能。
发布于 2016-09-19 15:21:36
通过将代码逐字复制到测试中,您实际上并不是在检查任何假设。在那一点上这是一个重言式。将单元测试分解为test input
、function output
和expected output
,您正在测试函数应该如何与实际实现一起工作的假设。
因为
assert function(input) == function(input)
总是真实的,你实际上是在伤害自己,因为你的测试服永远不会报告回归,即使它们是被引入的。
发布于 2016-09-20 22:58:15
您正在尝试使用property base testing
编写测试。它是一种有效的算法测试方法。Haskell.quickcheck
是第一个实现。
它除了生成随机数(在指定的属性空间中)之外,还减少了集合,以便于调试失败的测试。
你很幸运: Python有一个QuickCheck
https://stackoverflow.com/questions/39583408
复制相似问题