在这种情况下,我应该对所有可能的输入进行单元测试吗?
Should I unit-test all possible inputs in this case?
我有一个具有以下签名的方法:
ConfigTreeNode FilterFirstChild<T>(Func<ConfigTreeNode, T> getProp, T key)
用法如下:
MyObj.FilterFirstChild(x => x.Prop1, "foo") //assuiming Prop1 is a string
调用者可以使用任何 属性 代替 Prop1
(即 Prop2
、Prop3
)。
现在我的问题是我是否应该编写涵盖所有可能属性的多个单元测试?
即
public void FilterFirstChild_GivenChildProp1_ReturnsCorrectChild()
public void FilterFirstChild_GivenChildProp2_ReturnsCorrectChild()
public void FilterFirstChild_GivenChildProp3_ReturnsCorrectChild()
或者我应该只编写一个测试一般工作行为的测试
即
public void FilterFirstChild_GivenChildProp_ReturnsCorrectChild() // not prop1, prop2... etc
如果这是一个愚蠢的问题,我们深表歉意。
一般来说,单元测试的目的是覆盖场景(即 if 条件),而不是所有可能的数据输入。如果处理 Prop1
和 Prop2
之间有任何区别,那么涵盖两者是有意义的。如果没有 - 离开通用测试是可以的。
另外值得一提的是,单元测试框架通常有一个工具可以 运行 针对多组数据进行测试。例如 NUnit
有 TestCaseAttribute
:
[Test]
[TestCase(SomeEnum.SomeValue)]
public void MethodName_Condition_ThrowsException(SomeEnum someValue)
{
//...
}
我有一个具有以下签名的方法:
ConfigTreeNode FilterFirstChild<T>(Func<ConfigTreeNode, T> getProp, T key)
用法如下:
MyObj.FilterFirstChild(x => x.Prop1, "foo") //assuiming Prop1 is a string
调用者可以使用任何 属性 代替 Prop1
(即 Prop2
、Prop3
)。
现在我的问题是我是否应该编写涵盖所有可能属性的多个单元测试?
即
public void FilterFirstChild_GivenChildProp1_ReturnsCorrectChild()
public void FilterFirstChild_GivenChildProp2_ReturnsCorrectChild()
public void FilterFirstChild_GivenChildProp3_ReturnsCorrectChild()
或者我应该只编写一个测试一般工作行为的测试
即
public void FilterFirstChild_GivenChildProp_ReturnsCorrectChild() // not prop1, prop2... etc
如果这是一个愚蠢的问题,我们深表歉意。
一般来说,单元测试的目的是覆盖场景(即 if 条件),而不是所有可能的数据输入。如果处理 Prop1
和 Prop2
之间有任何区别,那么涵盖两者是有意义的。如果没有 - 离开通用测试是可以的。
另外值得一提的是,单元测试框架通常有一个工具可以 运行 针对多组数据进行测试。例如 NUnit
有 TestCaseAttribute
:
[Test]
[TestCase(SomeEnum.SomeValue)]
public void MethodName_Condition_ThrowsException(SomeEnum someValue)
{
//...
}