代码合同真的有助于单元测试吗?

时间:2010-07-27 15:36:54

标签: c# unit-testing .net-4.0 code-contracts

我对单元测试有相当多的了解。我一直试图阅读代码合同。它真的有助于单元测试吗?它是否被高估了,特别是当我们谈论有助于进行单元测试的代码合同时。我特指的是.net 4.0中的合同。我使用nunit进行单元测试。

3 个答案:

答案 0 :(得分:4)

。单元测试基本上是一个合同,上面说MyMethod()接受X并期望Y是结果,当它不这样做时,单元测试失败并且你作为MyMethod()的开发者被警告你破坏了里面的东西。代码合同确实可以帮助您编写单元测试,因为合同中的要求使您在编写单元测试时更容易了解单元测试的要求。但是,代码合同的真正原因不适合您,而是适用于使用您创建的API的其他开发人员。单元测试可以让您了解正确的输入和输出,但是当您将代码发布到野外时,单元测试不会与.dll一起发布。代码合同为其他开发人员提供了通过编译时合同和检查了解相同要求的好处。合同可以防止那些有可能不会阅读方法文档并且只是开始传递内容的开发人员(我),所以现在他们将通过合同得到积极的警告。

答案 1 :(得分:4)

代码合同可用于不能使用单元测试的东西(接口合同)。它们应用于继承链(您可以通过手动单元测试轻松犯错)。它们自动提供文档(单元测试无法做到)。他们可以在生产中提供运行时检查(单元测试无法做到)。

另一方面,合同只有在执行时才会失败,因此如果没有单元测试,您就无法保证代码质量(即所有代码都满足各种合同)。这两个概念是免费的。

答案 2 :(得分:0)

不,我不认为代码合同可以帮助您编写单元测试。单元测试定义给定操作的行为和约束。在单元测试中编写的那些规范之一可能是方法的参数不能为空。

在这种情况下,您仍然需要编写单元测试。代码契约是实现规范的一种方式,但不是唯一的方法。

换句话说,不要假设使用代码合同意味着您不必编写单元测试!如果某人更改了代码合同或将其删除,您将无法通过测试告诉您该预期规范已失败。