分组JUnittesting

有没有办法在JUnit中对testing进行分组,以便我只能运行一些组?

还是有可能注释一些testing,然后全局禁用它们?

我正在使用JUnit 4 ,我不能使用TestNG。

编辑: @RunWith和@SuiteClasses伟大的作品。 但是有没有可能像这样只在testing类中进行一些testing呢? 还是我必须注释整个testing类?

你想在一个testing类里面进行testing吗?还是你想把testing类分组? 我将承担后者。

这取决于你如何运行你的testing。 如果你通过Maven运行它们,可以指定你想包含的testing。 请参阅Maven surefire文档 。

但是更一般地说,我所做的是我有一套testing套件。 JUnit 4中的testing套件如下所示:

  @RunWith(Suite.class) @SuiteClasses(SomeUnitTest1.class, SomeUnitTest2.class) public class UnitTestsSuite { } 

所以,也许我有一个FunctionTestsSuite和一个UnitTestsSuite,然后是一个包含另外两个的AllTestsSuite。 如果你在Eclipse中运行它们,你会得到一个很好的分层视图。

这种方法的问题在于,如果你想以不同的方式分割testing,那就太乏味了。 但是它仍然是可能的(例如,你可以有一套基于模块切片的套件,然后是另一种testingtypes的切片)。

JUnit 4.8支持分组:

 public interface SlowTests {} public interface IntegrationTests extends SlowTests {} public interface PerformanceTests extends SlowTests {} 

接着…

 public class AccountTest { @Test @Category(IntegrationTests.class) public void thisTestWillTakeSomeTime() { ... } @Test @Category(IntegrationTests.class) public void thisTestWillTakeEvenLonger() { ... } @Test public void thisOneIsRealFast() { ... } } 

最后,

 @RunWith(Categories.class) @ExcludeCategory(SlowTests.class) @SuiteClasses( { AccountTest.class, ClientTest.class }) public class UnitTestSuite {} 

采取从这里: http : //weblogs.java.net/blog/johnsmart/archive/2010/04/25/grouping-tests-using-junit-categories-0

而且,Arquillian本身支持分组: https : //github.com/weld/core/blob/master/tests-arquillian/src/test/java/org/jboss/weld/tests/Categories.java

为了处理全局禁用它们,JUnit(4.5+)有两种方法,一种是使用新的方法assumeThat。 如果将它放在testing类的@BeforeClass(或@Before)中,并且条件失败,它将忽略testing。 在这种情况下,你可以把一个系统属性或其他可以全局设置或closures的其他东西。

另一种select是创build一个自定义的跑步者,了解全局属性并委托给适当的跑步者。 这种方法更加脆弱(因为JUnit4内部运行者不稳定,可以从发布版本更改为发布版本),但是它的优点是可以inheritance一个类层次结构并在子类中重写。 如果您必须支持遗留的JUnit38类,那么这也是唯一现实的方法。

这里是一些代码来做自定义亚军。 关于getAppropriateRunnerForClass可能做什么,我实现它的方式是有一个单独的注释,告诉自定义运行程序与什么运行。 唯一的select是来自JUnit代码的一些非常脆弱的复制粘贴。

 private class CustomRunner implements Runner private Runner runner; public CustomRunner(Class<?> klass, RunnerBuilder builder) throws Throwable { if (!isRunCustomTests()) { runner = new IgnoredClassRunner(klass); } else { runner = getAppropriateRunnerForClass(klass, builder); } public Description getDescription() { return runner.getDescription(); } public void run(RunNotifier notifier) { runner.run(notifier); } } 

编辑:@RunWith标签只适用于整个类。 解决这个限制的一个方法就是将testing方法移动到一个静态的内部类中并对其进行注释。 这样你就有了类的组织的注释优势。 但是,这样做不会对任何@Before或@BeforeClass标记有帮助,您将不得不在内部类中重新创build这些标记。 它可以调用外部类的方法,但它必须有自己的方法作为钩子。

尝试JUnittesting组 。 从文档:

 @TestGroup("integration") public class MyIntegrationTest { @ClassRule public static TestGroupRule rule = new TestGroupRule(); ... } 
  • 执行一个简单的testing组:-Dtestgroup =集成
  • 执行多个testing组:-Dtestgroup = group1,group2
  • 执行所有testing组:-Dtestgroup = all

您可以创build包含testing组的testing套件对象。 或者,您的IDE(如Eclipse)可能支持运行给定包中包含的所有testing。

您可以使用testing套件( http://qaautomated.blogspot.in/2016/09/junit-test-suits-and-test-execution.html )或者您可以将Junit类别( http://qaautomated.blogspot.in/ 2016/09 / junit-categories.html )来有效地分组你的testing用例。