如何通过unittest判断函数是否已经在Python中进行了充分的测试?

如何通过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):

假设我们有一个返回特殊性(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 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来测试该函数。您的函数返回一些内容,但异常条件返回的代码当前是语法错误。