2

我需要以下测试

@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 进行分组时,JUnit 会忽略除 RAM 和 Cache 集合之外的所有单个测试方法。在 JUnit 设计中似乎不能有兄弟文件和文件夹。官方分组示例中的注释也暗示了

@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 套件)混合,这对吗?为什么?如何解决这个问题?可能有替代方案@runwith.Suite吗?

4

2 回答 2

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

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

于 2013-09-20T05:00:21.620 回答
1

你的设计应该是这样的:

// 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 文件。不要使用内部类。

于 2013-09-19T13:26:35.053 回答