如何命名和组织测试具有多个参数的方法的单元测试?

时间:2011-03-10 13:00:18

标签: unit-testing language-agnostic

鉴于此方法必须进行测试:

// Search the given value using the provided search options
// Return true if the searchValue was found; false otherwise 
bool Search(string searchValue, bool useExactSearch, bool useIndexing)

我有6个重要的searchValues(一个带有ponctuation,一个带有重音字符,一个带有换行符等),我需要使用useExactSearch和useIndexing的每个可能组合进行验证。这意味着54个测试用例。

你怎么做的?你真的写了54个单元测试吗?如果是这样,你怎么称呼它们?您是否仅针对最重要的案例编写测试?您是否编写了一个单元测试,它循环遍历一个参数值和预期结果表?如果我进行单个单元测试,当持续集成报告失败时,很难找到哪个案例被破坏。

3 个答案:

答案 0 :(得分:4)

如果你正在使用NUnit(.Net),你可以这样做:

[TestCase("John*",true, false, false)]
[TestCase("*user*",false, true, true)]
[TestCase(".",true, false, true)]
public void SearchTest(string param1, bool param2, bool param3, bool expectedResult)
{
    YourClass clazz = new YourClass();
    bool result = clazz.Search(param1, param2, param3);
    Assert.AreEqual(expectedResult, result);
}

NUnit Test Runner将执行3次。并且,正如您可以看到here,报告显示所有分开的测试用例,这有助于您确定谁破坏了构建。 这可能在大多数xUnit框架上都可用。

答案 1 :(得分:3)

在他的“单位测试艺术”一书中,Roy Osherove建议使用这个命名惯例:

MethodUnderTest_ConditionUnderTest_ExpectedBehaviour()

这似乎合情合理。至于如何使用不同的参数对多个相同函数进行多次测试,我认为单个测试会使错误更清楚,并且可以使用重构来最小化测试之间的重复。

另一方面,它不是语言不可知的,但NUnit允许参数化测试,因此其他单元测试框架也可能这样做。这是“一个难以理解的失败原因”测试和54个“几乎完全相同的,有大量复制”测试之间的一个很好的中途。

答案 2 :(得分:0)

应该至少针对重要的测试用例编写测试,并且可以根据TestSeachForPunctuation,TestSeachForAccentedChars,TestSeachForLineBreaks等测试用例来命名测试。