【问题标题】:Code Contracts and Code Coverage代码合同和代码覆盖率
【发布时间】:2014-02-04 14:31:15
【问题描述】:

我在我的 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
}

既然条件不满足合约就会失败,代码覆盖率工具不应该报告两个参数都被覆盖了吗?

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

【问题讨论】:

  • 感谢您的链接!我认为这意味着我必须通过单元测试来测试异常抛出,例如检查MyMethod(null, null) 是否真的抛出ArgumentNullException。但是,这不太理想,因为合约已经保证了功能。有人可以确认是这种情况吗?

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


【解决方案1】:

所以,如果您的任何一个论点是 null,代码合同将抛出 ArgumentNullException,这在技术上是正确的。

但是,对您的先决条件进行单元测试仍然是一个好主意。确保代码合同正常工作并不是那么重要——它确实如此!但这是为了确保您确实指定了正确合约!

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

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

虽然代码契约在帮助您编写不会失败的代码方面大有帮助,但它并不是灵丹妙药。它无法捕获所有逻辑错误(例如,代码契约无法帮助您避免无限循环)。因此,即使使用代码契约,单元测试仍然是开发过程中非常重要的一部分。

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2015-03-01
    • 2023-03-27
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多