如何通过unittest判断函数是否已经在Python中进行了充分的测试?
假设我们有一个返回特殊性(spec)的函数: 文件名:data.py如何通过unittest判断函数是否已经在Python中进行了充分的测试?,python,function,unit-testing,Python,Function,Unit Testing,假设我们有一个返回特殊性(spec)的函数: 文件名:data.py def spec(TN, FP): try: spec = TN / (TN + FP) return spec except ZeroDivisionError: return float("nan") 我正在用以下内容来测试这一点: import unittest class TestSpec(unittest.TestCase):
def spec(TN, FP):
try:
spec = TN / (TN + FP)
return spec
except ZeroDivisionError:
return float("nan")
我正在用以下内容来测试这一点:
import unittest
class TestSpec(unittest.TestCase):
def test_spec(self):
result = data.spec(1, 2)
self.assertEqual(result, 1/3)
我如何知道这是否是一个完整的测试?因为我只使用了两个输入(预期结果是这些输入的1/3)。如何知道是否使用负值等进行测试?在这种情况下,除了使用两个输入之外,测试一个函数是否有益,这一点有点困惑。最佳实践是什么?使用代码覆盖率工具(例如查看测试测试了哪些代码行)
测试nan
很棘手,因为float('nan')==float('nan')
返回False
下面显示了如何测试nan
,以及如何直接测试ZeroDivisionError
异常:
import unittest
import math
def spec1(TN, FP):
try:
spec = TN / (TN + FP)
return spec
except ZeroDivisionError:
return float("nan")
def spec2(TN, FP):
spec = TN / (TN + FP)
return spec
class TestSpec(unittest.TestCase):
def test_spec1_good_values(self):
result = spec1(1, 2)
self.assertEqual(result, 1/3)
def test_spec1_nan(self):
result = spec1(1,-1)
self.assertTrue(math.isnan(result))
def test_spec2_good_values(self):
result = spec2(1, 2)
self.assertEqual(result, 1/3)
def test_spec2_exception(self):
with self.assertRaises(ZeroDivisionError):
spec2(1,-1)
if __name__ == '__main__':
unittest.main()
有一个名为coverage的模块,它告诉您代码测试的百分比,并突出显示尚未测试的代码行yetTest coverage reporting、突变测试、“glass box”测试(即,您编写了代码,因此知道该测试未完全覆盖代码)。代码覆盖率工具会告诉您没有覆盖异常情况,这实际上是一个错误,将该文本转换为浮点。@Mark Tolonen谢谢。是否可以测试此异常情况?因为我读到了关于您是否可以的混合信息。例如,此线程暗示不可以:该问题的答案取决于函数假设没有返回任何内容。从技术上讲,可以通过捕获stdout来测试该函数。您的函数返回一些内容,但异常条件返回的代码当前是语法错误。