C# ";“意图”;单元测试背后——我应该瞄准什么?

C# ";“意图”;单元测试背后——我应该瞄准什么?,c#,java,unit-testing,C#,Java,Unit Testing,今天,我围绕一个方法编写了一系列测试,该方法接受一个输入值并返回一个不同的数据数组,这取决于该值是否通过了一些(内部)验证测试,即 [TestMethod] public void IsValidForValueFour() { var result = myComponent.Validator(4); Assert.IsTrue(result[0], "Blah"); } Validator()方法基本上是在myComponent中私有存储的(硬编码)表中进行查找 这感觉

今天,我围绕一个方法编写了一系列测试,该方法接受一个输入值并返回一个不同的数据数组,这取决于该值是否通过了一些(内部)验证测试,即

[TestMethod] 
public void IsValidForValueFour()
{
    var result = myComponent.Validator(4);
    Assert.IsTrue(result[0], "Blah");
}
Validator()
方法基本上是在
myComponent
中私有存储的(硬编码)表中进行查找

这感觉不对。我在一个私有查找表中有效地测试了这些值。我应该关心传入和传出的值吗?我应该测试输出数组的长度而不是它的内容吗?或者在给定一些输入值的情况下测试特定的响应是否正确


简而言之,像这样的单元测试背后的意图应该是什么?

这很有价值,因为您现在知道函数正在返回它应该返回的内容

在将来,如果您更改了实现,只要测试都通过,您就可以确信它仍然做它应该做的事情



至于你应该测试这些东西吗?这取决于您希望执行多少测试以及您认为从这些测试中获得的价值。

单元测试应该测试一小段代码,比如一个对象,甚至一个方法,并且应该寻找方法/类可能破坏的方式。IMHO,一个永不中断的单元测试也可能不存在

如果您的方法的契约是它返回
输入
4
的“Blah”
,那么是的,您应该测试它

MyComponent.Validator(4)的契约是它返回一个数组,该数组的第一个元素是
true
,那么这个测试是有用的。然而,这实际上取决于该方法背后的逻辑有多复杂。我遵循的规则之一是,通过编写简短、简单的方法,您可以跳过很多测试:若某个东西非常简单,可以通过视觉验证,那个么它通常不值得测试


如果
Validator()。我将为端点值编写测试,然后继续。

您应该通过传入许多有效的数据片段,甚至更多无效的数据片段来测试它,以确保它像预期的那样工作。这就是重点。您的方法必须执行它应该执行的操作,否则需要重新编写。这样,这些信息的使用者(您或其他开发人员)就可以使用这些数据,而不必担心方法的内部实现


事实上,如果你有一段评论,其中包含你读过的小说中的文本(我承认这很愚蠢),但你的方法接受并返回它所说的应该返回的内容,那么消费者将永远不会知道或关心你是如何实现该方法的。

如果从需求的角度来看它很重要,你应该对此进行测试。若值4必须返回“Blah”这一点很重要,那个么您就有了有效的测试——但我也肯定会将数字4提取到一个有意义的变量名中,并将其传递给验证器。所以无论谁读了你的测试,都会知道你为什么通过了值4。 如果您正在测试某种算法,请尝试使用Pex之类的工具为您生成输入。这也将确保SUD(测试中的系统)中的逻辑按预期运行