代码合同和代码覆盖率

时间:2014-02-04 14:31:15

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

我在C#应用程序中使用Code Contracts以及单元测试。当我要求单元测试的代码覆盖率结果时,包含代码合同的行被报告为“未涵盖”。

让我们以一个有两个参数的方法为例:

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

    // Other stuff covered explicitly by unit tests
}

由于如果条件不符合合同就失败了,代码覆盖率工具是否应该报告这两个参数被覆盖?

根据我的理解,合同涵盖的代码不需要再次进行单元测试。这是对的吗?

1 个答案:

答案 0 :(得分:0)

因此,从技术上讲,如果您的任何一个参数都是ArgumentNullException,则代码约定将抛出null

但是,对单元测试前提条件仍然是一个好主意。并不是要确保代码合同正常工作 - 它确实如此!但是要确保实际指定正确的合同!

我是根据个人经验说的。我正在撰写关于代码合同和单元测试的博客文章。在编写示例代码时,我说明了方法的前提条件。我运行了单元测试并且一些测试失败了。我有点吃惊。发生了什么?嗯,愚蠢的我,我颠倒了我想强制执行的布尔条件。哎呀。但是,由于单元测试,它被捕获并且很容易纠正。

此外,代码约定不仅仅是保证参数不为空(在您的示例中)。代码约定还可以作为与代码客户的通信形式。它们告诉您的库的消费者,如果它们符合规定的前提条件,则保证该方法将成功执行并满足任何对象不变量和/或声明的方法后置条件。

虽然代码约定可以帮助您编写不会失败的代码,但它并不是一个灵丹妙药。它无法捕获所有逻辑错误(例如,Code Contracts不会帮助您避免无限循环)。因此,即使使用代码合同,单元测试仍然是开发过程的重要部分。