Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中对递归函数进行单元测试?_Python_Recursion_Python Unittest - Fatal编程技术网

如何在python中对递归函数进行单元测试?

如何在python中对递归函数进行单元测试?,python,recursion,python-unittest,Python,Recursion,Python Unittest,我想知道,如果递归函数被正确调用,如何进行单元测试。例如,此功能: def test01(编号): 如果(len(number)==1): 返回1 其他: 返回1+test01(编号[1:]) 它递归计算一个数字的位数(假设数字类型为字符串) 因此,我想测试函数test01是否被递归调用。如果它是这样实现的,那就可以了,但如果它是这样实现的,那就不行了: def test01(number): return len(number) 编辑: 出于教育目的,递归方法是强制性的,因此Uni

我想知道,如果递归函数被正确调用,如何进行单元测试。例如,此功能:

def test01(编号):
如果(len(number)==1):
返回1
其他:
返回1+test01(编号[1:])
它递归计算一个数字的位数(假设数字类型为字符串) 因此,我想测试函数test01是否被递归调用。如果它是这样实现的,那就可以了,但如果它是这样实现的,那就不行了:

def test01(number):
    return len(number)
编辑: 出于教育目的,递归方法是强制性的,因此UnitTest过程将自动化编程练习检查。有没有办法检查函数是否被多次调用?如果可能的话,我可以进行两个测试,一个测试断言正确的输出,另一个测试检查是否对同一输入多次调用该函数。


提前感谢您的帮助

通常,单元测试应该至少检查您的函数是否工作,并尝试测试其中的所有代码路径

因此,您的单元测试应该多次尝试使用主路径,然后找到退出路径,从而实现完全覆盖

您可以使用第三方查看您的所有代码路径是否都被占用

pip install coverage

python -m coverage erase       # coverage is additive, so clear out old runs
python -m coverage run -m unittest discover tests/unit_tests
python -m coverage report -m   # report, showing missed lines

通过标记猜测,我假设您想使用
unittest
来测试递归调用。以下是此类检查的示例:

从unittest导入TestCase
导入my_模块
类递归测试(TestCase):
def设置(自):
self.counter=0#统计呼叫数
def checked_fct(self,fct):#在每次调用时增加一个计数器的包装函数
def包装(*args,**kwargs):
self.counter+=1
返回fct(*args,**kwargs)
退货包装
def测试_递归(自):
#将函数替换为选中的版本
使用mock.patch('my_module.test01',
self.checked_fct(my_module.test01)):#假设test01位于my_module.py中
result=my_module.test01('444')35;调用函数
self.assertEqual(结果,3)#检查结果是否正确
self.assertGreater(self.counter,1)#确保函数被多次调用
注意:我使用了
import my_module
而不是my_module import test01中的
,因此第一个调用也会被模拟-否则调用的数量会太少


根据您的设置,您可以手动添加进一步的测试,或为每个测试自动生成测试代码,或使用pytest的参数化,或执行其他操作来自动化测试。

为什么要以不同于迭代实现的方式测试上述功能?这就是测试实现,不是行为。如果它被重构,以不同的方式给出正确的答案,那么测试是否会失败?你的愿望是可以理解的(我年轻时就有这个愿望),但我鼓励你忽略它:测试你的函数的行为(它是否给出正确的答案),而不是它的实现细节。如果函数通过打电话给oracle神奇地得到了正确的答案,你真的应该关心吗?单元测试是你编写的测试,用来验证函数在你能想到的每种情况下都能正常工作。您可以控制它的调用方式,因此不能错误地调用它。按照您的措辞,听起来更像是需要运行时检查来验证输入。或者,您可能会询问如何向用户显示一个接口,但使用另一个接口进行内部递归调用。这很简单——只需给递归函数另一个名称,通常以下划线开头,然后从公开导出的函数调用它。