language-agnostic - 我需要一个基本的具体示例来说明如何将 TDD 与按契约(Contract)设计一起使用

标签 language-agnostic tdd design-by-contract

我见过很多类似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)

无论输入是什么,我们都使用合约来确保某些属性保持不变。在这个例子中,我们断言:

  1. 返回的列表与输入列表的长度相同。
  2. 返回的第一项始终小于或等于返回的最后一项。

(这些合约是用 PEP-316 语法写的,可以用 CrossHair 来检查)

关于language-agnostic - 我需要一个基本的具体示例来说明如何将 TDD 与按契约(Contract)设计一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56723073/

相关文章:

c# - 如何验证多个排序已应用于集合?

.net - .NET 4.0 的契约设计与 Eiffel 相比如何?

java - 您有任何有效使用 Java Assert 的技巧吗?

language-agnostic - 选择 Web 服务的方法

language-agnostic - 如何确定错误的优先级?

java - 使用正则表达式测试 Servlet 中的字符串

JavaScript 契约和断言

javascript - 确定 float 中前导零的数量

graphics - 画一个不完美的圆

java - BDD 方式的 JUnit 测试应该如何集中