C# 代码合同和代码覆盖率

C# 代码合同和代码覆盖率,c#,.net,unit-testing,code-contracts,C#,.net,Unit Testing,Code Contracts,我在我的C#应用程序中使用代码契约以及单元测试。当我询问单元测试的代码覆盖率结果时,包含代码契约的行被报告为“未覆盖” 让我们以具有2个参数的方法为例: void MyMethod(object param1, object param2) { Contract.Requires<ArgumentNullException>(param1 != null); Contract.Requires<ArgumentNullException>(param2 !

我在我的C#应用程序中使用代码契约以及单元测试。当我询问单元测试的代码覆盖率结果时,包含代码契约的行被报告为“未覆盖”

让我们以具有2个参数的方法为例:

void MyMethod(object param1, object param2) {
    Contract.Requires<ArgumentNullException>(param1 != null);
    Contract.Requires<ArgumentNullException>(param2 != null);

    // Other stuff covered explicitly by unit tests
}
void MyMethod(对象参数1,对象参数2){
Contract.Requires(param1!=null);
Contract.Requires(param2!=null);
//单元测试明确涵盖的其他内容
}
既然如果条件不满足,契约就会失败,那么代码覆盖率工具不应该报告这两个参数是否被覆盖了吗


据我所知,合同中包含的代码不需要再次进行单元测试。这是否正确?

因此,如果您的任何一个参数为null,那么代码契约将抛出ArgumentNullException,这在技术上是正确的

然而,单元测试您的前提条件仍然是一个好主意。这并不是为了确保代码契约正常工作,而是为了确保代码契约正常工作!但这是为了确保您实际指定了正确的合同

我是根据个人经验说的。我在写一篇关于代码契约和单元测试的博客文章。在编写示例代码时,我声明了一个方法的先决条件。我运行了单元测试,有几个测试失败了。我有点吃惊。怎么搞的?好吧,愚蠢的我,我颠倒了我想要强制执行的布尔条件。哎呀。不过,多亏了单元测试,这一点被发现并很容易纠正

此外,代码契约不仅仅是保证参数不为null(在您的示例中)。代码契约还可以作为与代码客户沟通的一种形式。它们告诉库的使用者,如果他们满足所述的先决条件,则可以保证方法将成功执行并满足任何对象不变量和/或所述的方法后条件


虽然代码契约可以在很大程度上帮助您编写不会失败的代码,但它并不是万能的。它不能捕获所有逻辑错误(例如,代码契约不能帮助您避免无限循环)。因此,即使在使用代码契约的情况下,单元测试仍然是开发过程中非常重要的一部分。

看看这里,谢谢链接!我认为这意味着我必须通过单元测试测试异常抛出,例如检查
MyMethod(null,null)
是否实际抛出
ArgumentNullException
。但这并不理想,因为合同保证了功能。有人能证实这一点吗?