Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用代码契约进行单元测试_.net_C# 4.0_Code Contracts - Fatal编程技术网

.net 如何使用代码契约进行单元测试

.net 如何使用代码契约进行单元测试,.net,c#-4.0,code-contracts,.net,C# 4.0,Code Contracts,使用.NET4.0代码契约进行TDD的最佳实践建议是什么 我想具体地说,我的问题是,鉴于TDD的一点是允许代码自文档化,并且契约现在提供了文档的一部分,那么代码契约是否应该以与其他代码相同的方式进行测试?这是一个很好的问题。简单的答案是否定的。代码契约可以处理与系统行为无关的多余测试。如果您真的可以获得100%的代码覆盖率,您将需要注意isnull检查等。这些检查不需要在您的测试套件中。附加的好处是,这些将在编译时检查,而不是等待测试执行 希望这能有所帮助。这取决于您如何使用合同以及您正在开发什

使用.NET4.0代码契约进行TDD的最佳实践建议是什么


我想具体地说,我的问题是,鉴于TDD的一点是允许代码自文档化,并且契约现在提供了文档的一部分,那么代码契约是否应该以与其他代码相同的方式进行测试?

这是一个很好的问题。简单的答案是否定的。代码契约可以处理与系统行为无关的多余测试。如果您真的可以获得100%的代码覆盖率,您将需要注意isnull检查等。这些检查不需要在您的测试套件中。附加的好处是,这些将在编译时检查,而不是等待测试执行


希望这能有所帮助。

这取决于您如何使用合同以及您正在开发什么类型的应用程序

首先:您当然不想单独测试断言和后置条件(
Contract.Assert
Contract.assession
Contract.Associated
Contract.AssuresOnthrow
)。 我认为这样做没有实际价值——因为它们已经在运行时被重写器验证过,即使没有测试,您也会很快发现失败。
然而,在经过良好测试的应用程序中,即使输入无效,后置条件或断言也不应失败。因此,如果您的所有测试(即使是测试无效数据处理的测试!)都通过了,而没有一个后置条件/断言失败,那么您的后置条件和断言可以被视为“已测试”。
为此,您可能希望在测试中使用“Assert.Fail”来处理ContractFailed事件

现在,“有趣”部分是先决条件:
你在开发图书馆吗?然后,如果您的时间/预算允许,您一定要测试它们(不测试实际逻辑更糟糕)。
特别是,如果您使用的是“Contract.Requires”重载,它将在契约失败时引发特定的异常,那么您应该像使用“if-throw”构造进行常规参数验证一样对其进行测试

如果您不是在编写库,我不会说测试前提条件确实是必要的——它们不是真正的业务需求,而是调试的助手。
如果一个参数是
null
,那么为每个
ArgumentNullException
方法应该抛出的异常编写单元测试会变得非常无聊
如果您在方法中忘记了这个验证代码(意思是:特定的Contract.Requires),那么您可能也会忘记单元测试。因此,参数验证测试为(非库)代码带来的附加值比连接值要低


总而言之:不要测试后置条件和断言。做测试前提条件-但只在库上(可能还有像库一样使用的部分代码)。

结合代码契约创建单元测试的一个有用工具是Pex。它分析您的代码并为其生成基本单元测试。最重要的是,它能够识别和理解代码契约,从而适应它生成的测试代码


如果你有MSDN订阅,那么你可以下载Pex/Moles作为一个powertool,否则你可以在下载它(不是最新版本)。

我不同意这里的其他一些人的观点。契约不是测试,它们是关于API的需求和承诺的断言。它们不会神奇地证明您的代码是正确的,它们只是在您违反合同时在运行时向您提供信息。我不知道你们的情况,但我不想发送代码,因为在某些极端情况下,代码未能遵守合同,并因合同声明而崩溃!与任何其他行为一样,契约应该经过单元测试。如果您没有执行合同(以及间接执行合同的代码路径),您就没有代码有效性的证据。代码契约和单元测试不是相互排斥的概念。

测试用于测试代码的预期行为

您不应该明确地编写测试来执行契约断言

然而,在TDD中或在进行代码更改时,运行单元测试可能会以导致契约失败的方式运行代码-当这种情况发生时,测试应该失败,并且您需要能够快速轻松地找到失败的契约,以便您可以更正代码

所以,不知何故,如果只是为了执行Asser.Fail(“未满足合同要求”),您希望捕获一个contractexception

这可能更符合你的要求

“不要测试后置条件和断言。测试先决条件-但只能测试库(可能是代码中用作库的部分)。”-这听起来很不错的建议:这是基于你自己的经验,还是基于公认的智慧?@B Tyler:这是基于我的经验和与其他程序员的讨论。然而,这仍然只是我的观点,没有任何研究或长期研究的支持;-)嗯,我认为你应该测试所有的前置条件,原因很简单,你可能会在前置条件逻辑本身中出错(例如,错误地键入数字或字符串)。要知道你没有以这种方式搞砸,唯一的办法就是测试它。但除此之外,我同意您的观点,即不需要测试post条件和断言;还可以执行导致编译时错误的静态验证(例如,当使用可能为null的参数调用方法时,但契约要求该参数不为null)。