JUnit测试的层次结构

时间:2013-09-19 12:44:15

标签: junit grouping hierarchy folding

我需要以下测试

@runwith(cache, memory)
class CollectionA is -- this is a suite (aka folder)
  class Cache {   -- this is a sub-suite (aka folder)
    @test testCache1()  -- this is a method (aka file)
    @test testCache2()
    @test testCache3()
  }
  class RAM {  -- this is a sub-suite (aka folder)
    @test testRAM1()
    @test testRAM2()
  }
  @test testIO()
  @test testKeyboard()
  @test testMouse()
  @test testMonitor()
  @test testPower()
  @test testBoot()

请注意,只需对Cache和RAM进行分组。层次结构有助于对抗复杂性并运行相关测试,例如必要时单独缓存子系统。我使用@runwith进行分组的问题很快,除了RAM和Cache集合之外的所有单一测试方法都被JUnit忽略。看来你不能在JUnit设计中拥有兄弟文件和文件夹。 the official example of grouping中的评论也提示

@RunWith(Suite.class)
@Suite.SuiteClasses({
  TestA.class,
  TestA.class
})

public class FeatureTestSuite {
  // the class remains empty,
  // used only as a holder for the above annotations
  // HEY!!! WHAT ABOUT MY @Tests HERE?
}

答案说我是否需要包装每一个测试,例如testPower进入他们的单身衣服或压扁套房 - 完全摆脱等级。

那么,JUnit是否可以禁止将单个文件(@test方法)与文件夹(@runwith suites)混合使用?为什么?怎么能解决这个问题?可能有@runwith.Suite的替代方案吗?

2 个答案:

答案 0 :(得分:4)

您想要创建的是mixin类型,JUnit运行器不支持。所以,是的,你是对的,不可能开箱即用。

为此,我创建了一个附加组件,可用于为测试创建分层上下文。在我看来,这是JUnit中缺少的功能,我也保持联系以将其包含在JUnit核心中。

附加组件提供了一个HierarchicalContextRunner,它允许使用内部类将测试分组到上下文中。每个上下文都可以包含测试或其他上下文。它还允许@Before,@ After,@ Rule方法和字段,以及其他功能,如标准Runner的@Ignore。 : - )

示例:

@RunWith(HierarchicalContextRunner.class)
public class CollectionA {
    public class Cache {
        @Test testCache1() {...}
        @Test testCache2() {...}
        @Test testCache3() {...}
    }
    public class RAM {
        @Test testRAM1() {...}
        @Test testRAM2() {...}
    }
    @Test testIO() {...}
    @Test testKeyboard() {...}
    @Test Mouse() {...}
    @Test testMonitor() {...}
    @Test testPower() {...}
    @Test testBoot() {...}
}

尝试一下: https://github.com/bechte/junit-hierarchicalcontextrunner/wiki

非常感谢投票和反馈。 :)

答案 1 :(得分:0)

你的设计应该是这样的:

// folder com.myco.project
SuiteX.java
TestA.java
TestB.java


// contents of TestA.java
public class TestA{
   @Test
   public void someTestInA(){...}
}

// contents of TestB.java
public class TestB{
   @Test
   public void someTestInB(){...}
}

// contents of SuiteX.java
@RunWith(Suite.class)
@Suite.SuiteClasses({
  TestA.class,
  TestB.class
})
public class FeatureTestSuite {
  // the class remains empty,
  // used only as a holder for the above annotations
}

正如我在评论中所述,为每个测试类使用单独的java文件。不要使用内部类。