【问题标题】:Writing better JUnit Parameterized test cases编写更好的 JUnit 参数化测试用例
【发布时间】:2012-09-14 09:21:19
【问题描述】:

我有一个有趣的需求。我希望在我的应用程序中拥有尽可能好的测试用例覆盖率。我正在使用参数化 Junit 运行具有不同输入数量的测试用例。我的示例测试类如下所示:

@Parameters
public static Collection<Object[]> testInputs()
{
    return Arrays.asList({
        {1, CoreMatchers.is(1)},
        {2, CoreMatchers.is(2)}
    });
}
@Test
public test()
{
    myApp.run(); 
    assertThat(myApp.getA(), matcher);
}

这样,我用我的测试参数定义了断言逻辑。现在我想在测试用例上运行多个匹配器,其中一些可以是我编写的自定义匹配器。

@Parameters
public static Collection<Object[]> testInputs()
{
    return Arrays.asList({
        {1, Arrays.asList( CoreMatchers.is(1), CustomMatchers.status(1) ) },
        {2, Arrays.asList( CoreMatchers.is(2), CustomMatchers.status(2) ) }
    });
}

而断言是这样的:

for(Matcher<MyApp> matcher: matchers)
{
    assertThat(myApp, matcher);
}

但问题是,两个匹配器都在不同的对象上运行。我可以定义我的 CustomMatcher 的最佳方式是什么?

我应该按匹配器类型对断言进行分类吗?

我将不胜感激。提前致谢。

【问题讨论】:

    标签: java junit junit4 hamcrest


    【解决方案1】:

    我不确定您所说的“两个匹配器都在不同的对象上运行”是什么意思,但您可以使用 CoreMatchers.allOf 将匹配器组合起来进行一次测试运行。这样您就不需要遍历匹配器列表,并且可以传递任意数量的匹配器,包括一个。

    @Parameters
    public static Collection<Object[]> testInputs()
    {
        return Arrays.asList({
            {1, CoreMatchers.allOf( CoreMatchers.is(1), CustomMatchers.status(1) ) },
            {2, CoreMatchers.allOf( CoreMatchers.is(2), CustomMatchers.status(2) ) }
        });
    }
    

    【讨论】:

      【解决方案2】:

      我不太确定您在问什么,但我认为您最好使用纯 java.lang 对象而不是 JUnit 对象作为参数。所以

      return Arrays.asList({
          {1, 1},
          {2, 2}
      });
      

      并在实际测试中使用is匹配器。

      如果匹配器做的事情真的不同,不要使用参数化测试,只需使用单独的测试方法。为了减少重复,使用常用的重构工具来提取测试方法之间的通用方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多