这听起来像是一件愚蠢的事。上下文是测试驱动开发:我有一个方法,它涉及到遍历树的节点,为了开发这个函数,我已经使用了:
“查看子节点”
“如果子节点有子节点,则查看子节点”
“如果子节点有子节点,则查看曾孙节点”。。。等等
所以你必须用递归方法来替换代码。如果您使用的是TDD,那么您需要编写一个断言语句,如果您的方法不是递归的,则该语句将失败。对于非TDD的人来说,这听起来可能很傻,但有一点是树通常包含很多递归功能,因此跳过这种测试步骤实际上感觉“很糟糕”!在
我想知道检查模块是否有我需要的。。。但我在挣扎。在我看来,在一个理想的世界中,您可能希望检测这种递归性,而不需要实际调用该方法。在
不能可靠地检查函数是否使用递归,不是吗
一个简单的递归函数将查找具有相同名称的全局函数并调用它,因此您必须查看函数字节码或将字节码解析为AST并尝试找到对同名全局对象的调用。但是如果使用的是一个方法或者函数是别名,那么您将有更困难的任务来检测它。在
此外,您通常测试被测对象的功能,而不是具体的实现。不是你想要的结果。在
也许您想避免递归,因为可能会用完堆栈。在这种情况下,您需要测试堆栈是否用完。在
将堆栈深度设置为一个小数字(使用^{} ),创建一个比堆栈级别多的树,并尝试对其进行解析。如果抛出
RuntimeError
异常,则说明您使用的递归或其他方法过于依赖Python调用堆栈。在即使在执行'TDD'时,检查方法是否是递归的也不是一个好主意。想想看,即使你能发现这个方法是递归的,那递归代码也有一千个错误。在
相反,在进行TDD时,提出要处理的数据集的小而好的表示形式,并编写案例以检查您正在编写的函数是否能够很好地处理它们。在
让我们考虑一个递归函数的例子来解析和查找树节点的总和。在
下面是一些我会考虑测试
functionality
而不是测试implementation
函数的测试数据案例:确保总数正确的阳性测试
然后测试一些退出条件:
添加一些阴性测试
等等。。。直到你学习了一些基本的组合。上两层。在
现在您知道要通过这些测试,您的函数必须执行
right
操作,不管递归与否。这是单元测试的目的。测试功能而不是实现的细节。一旦您确信您的测试是可靠的,并且通过这些测试的任何函数都是一个好函数,那么该函数是如何实现的就无关紧要了。它可能是递归的,也可能不是递归的,但是在编写单元测试时,您不应该关心。在
相关问题 更多 >
编程相关推荐