我见过很多类似this的问题和 this .有些人认为 TDD 和契约式设计之间存在重叠,而另一些人则说它们是互补的,我偏向于第二种,所以我需要一个非常基本、正确和完整的示例,用任何语言甚至是伪造的来说明如何使用它们在一起。
最佳答案
这是一个有点棘手的问题,因为“测试驱动开发”(TDD) 和“按契约(Contract)设计”(DbC) 都暗示了您的开发过程。 (一般来说测试/契约写在代码之前)
不过,由于您询问的是代码示例,因此您更感兴趣的是同时使用测试和契约(Contract)会是什么样子。这是一个例子:
def sort_numbers(nums: List[int]) -> List[int]:
'''
Tests:
>>> sort_numbers([4, 1, 2])
[1, 2, 4]
>>> sort_numbers([])
[]
Contracts:
post: len(__return__) == len(nums)
post: __return__[0] <= __return__[-1]
'''
return sorted(nums)
测试
我们使用测试来检查特定输入如何影响输出。例如,对数字 [4, 1, 2]
进行排序生成列表 [1, 2, 4]
.此外,对空列表进行排序会生成空列表。
(这些测试是使用 doctest 编写的,可以使用 python -m doctest <file>
进行检查)
契约(Contract)
无论输入是什么,我们都使用合约来确保某些属性保持不变。在这个例子中,我们断言:
- 返回的列表与输入列表的长度相同。
- 返回的第一项始终小于或等于返回的最后一项。
关于language-agnostic - 我需要一个基本的具体示例来说明如何将 TDD 与按契约(Contract)设计一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56723073/