Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
C# 当您有代码契约时,是否需要单元测试?_C#_Unit Testing_Code Contracts - Fatal编程技术网

C# 当您有代码契约时,是否需要单元测试?

C# 当您有代码契约时,是否需要单元测试?,c#,unit-testing,code-contracts,C#,Unit Testing,Code Contracts,如果您使用代码契约开发应用程序,您可能知道,这个概念是在Eiffel编程语言中引入的 在使用System.Diagnostics.Contracts在我的C#应用程序中尝试这个概念后,我变得非常困惑 我的主要问题是下一个: 如果您有代码契约,是否真的需要单元测试 单元测试框架通常不提供的一个主要区别是调用私有方法的可能性(除了带有垫片的MS fakes库)。由于支持组合,私有方法被公共方法调用覆盖的思想已经完成 至于代码契约,我可以声明Contract.Requires,Contract.con

如果您使用代码契约开发应用程序,您可能知道,这个概念是在
Eiffel
编程语言中引入的

在使用
System.Diagnostics.Contracts
在我的C#应用程序中尝试这个概念后,我变得非常困惑

我的主要问题是下一个:

如果您有代码契约,是否真的需要单元测试

单元测试框架通常不提供的一个主要区别是调用私有方法的可能性(除了带有
垫片的
MS fakes
库)。由于支持组合,私有方法被公共方法调用覆盖的思想已经完成

至于代码契约,我可以声明
Contract.Requires
Contract.conference
用于私有方法

那么,当我有代码契约时,为什么我需要单元测试,这种行为非常相似


谢谢

我想说不。通过使用代码契约,您可以定义代码应该做什么,并检查它是否正在做。单元测试在大多数情况下都做同样的事情,因此我认为它是多余的,以至于写这两个测试都不划算。

您肯定需要单元测试。 对于代码契约,您只能进行静态契约验证。 在运行代码时,您可以做更多的事情

例如,假设您正在测试一个依赖于IConnectionProvider的类。当GetConnection抛出时会发生什么?代码合同对你没有帮助


理想情况下,您应该使用不同的输入测试类的公共方法,并验证其行为是否符合预期。这将帮助您发现bug,并从长远来看,设计更好的代码。

您是否能够为您想要测试的每个方面编写代码契约?合同系统是否能够(在构建时)检查所有这些合同?这听起来不太可能。@JonSkeet我想,如果我想要一个没有bug的产品(在特定版本),我需要提供非常高的代码覆盖率。所以,对于单元测试(我总是试图达到100%),我想对代码契约也要这样做。另外,TDD行为(每个周期R->G->R)假设为每个目标单独开发干净的代码,当您没有完成前一个目标时,您不能切换到其他东西,是吗?老实说,我不认为代码覆盖率是代码质量的一个特别好的代理指标。100%的代码覆盖率是可行的,而不必真正考虑极端情况。我被这个问题弄糊涂了。如果你不测试合同,你怎么知道你得到了正确的合同?如果我使用牙线和漱口水,为什么我需要刷牙?严肃地说,这个问题有几个问题;1) 它假设所有强制使用代码契约的情况都与单元测试的原因密切相关;2) 它假设单元测试只有一个目的;3) 它假设有一个答案适合所有人。当然,答案是这些都不是真的,或者全部都是真的;这取决于项目的具体情况、目标受众、合同为何存在、单元测试为何存在以及您的目标。