.NET 4.0代码契约 - 它们将如何影响单元测试?

Fin*_*las 37 unit-testing .net-4.0 code-contracts microsoft-contracts

例如,本文介绍了它们.

有什么好处?

静态分析似乎很酷,但同时它会阻止在单元测试中传递null作为参数的能力.(如果您按照文章中的示例进行操作)

关于单元测试的主题 - 如果您已经实施自动化测试,那么现在肯定没有任何关系可以代码合同吗?

更新

玩过代码合约后,我有点失望.例如,根据接受的答案中的代码:

public double CalculateTotal(Order order)
{
    Contract.Requires(order != null);
    Contract.Ensures(Contract.Result<double>() >= 0);
    return 2.0;
}
Run Code Online (Sandbox Code Playgroud)

对于单元测试,您仍然必须编写测试以确保无法传递null,并且如果契约是业务逻辑,则结果大于或等于零.换句话说,如果我要删除第一个合同,除非我特意测试了这个功能,否则没有测试会中断.这是基于不使用内置于Visual Studio的更好(终极等)版本中的静态分析.

从本质上讲,它们都归结为编写传统if语句的另一种方式.我实际使用TDD的经验,代码合同显示了原因,以及我如何去做.

Lee*_*Lee 38

我不认为单元测试和合同会相互干扰那么多,如果有任何合同应该有助于单元测试,因为它不需要为无效参数添加繁琐的重复测试.合同指定了函数的最小值,而单元测试则尝试验证特定输入集的实际行为.考虑这个人为的例子:


public class Order
{
    public IEnumerable Items { get; }
}

public class OrderCalculator
{
    public double CalculateTotal(Order order)
    {
        Contract.Requires(order != null);
        Contract.Ensures(Contract.Result<double>() >= 0);

        return 2.0;
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,代码满足合同,但您仍然需要单元测试来验证它实际上是否符合您的预期.

  • 如果您有静态验证工具,您真的不需要单元测试合同指定的内容.Visual Studio 2010团队版将包含用于.NET代码合同的那些工具.如果静态验证程序未发出任何警告或错误,则代码满足合同. (7认同)
  • 单元测试和合同不是互斥的.合同做测试不能做的事情,测试需要确保合同正确并且调用代码遵守它们.仅仅因为你有一个Requires语句并不意味着你不应该对这个条件进行测试. (2认同)
  • 我完全同意@wekempf。如果我不遵守合同条件怎么办?合同是否正确?不,我会知道吗?或许。但也许还不够好。没有什么比单元测试更能真正告诉我代码是否按我的预期工作。当然,我也可能会输错单元测试。但很有可能,该测试最终会因此而失败。但是有了合同,我的代码可能永远不会失败,然而,我想要要求的条件可能最终由于拼写错误而永远不会得到满足。 (2认同)

Wim*_*nen 27

有什么好处?

假设您要确保方法永远不会返回null.现在使用单元测试,您必须编写一组测试用例,您可以使用不同的输入调用方法,并验证输出不为null.麻烦的是,你无法测试所有可能的输入.

使用代码契约,您只需声明该方法永远不会返回null.如果无法证明这一点,静态分析仪会抱怨.如果它没有抱怨,你知道你的断言对所有可能的输入都是正确的.

减少工作量,完美正确保证.有什么不喜欢的?