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

或者是否可以注释一些测试然后全局禁用它们?

我在用着 J单元4, ,我无法使用TestNG。

编辑: @RunWith 和 @SuiteClasses 效果很好。但是是否可以像这样仅注释测试类中的一些测试?或者我必须注释整个测试类吗?

有帮助吗?

解决方案

您想在测试类中对测试进行分组,还是要对测试类进行分组?我将假设后者。

这取决于您运行测试的方式。如果您通过Maven运行它们,则可以准确指定要包含的测试。请参阅 Maven surefire文档

更一般地说,我做的是我有一个测试套件树。 JUnit 4中的测试套件类似于:

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

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

这种方法的问题在于,如果你想以多种不同的方式对测试进行切片,那就太乏味了。但它仍然可能(例如,您可以根据模块切换一组套件,然后对测试类型进行另一次切片)。

其他提示

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+)有两种方法,一种是使用新方法。如果将它放在测试类的@BeforeClass(或@Before)中,如果条件失败,它将忽略测试。在这种情况下,您可以将系统属性或其他可以全局设置为开启或关闭的内容。

另一种方法是创建一个自定义运行器,它可以了解全局属性并委托给相应的运行器。这种方法更加脆弱(因为JUnit4内部运行程序不稳定并且可以从发行版更改为发行版),但它具有能够在类层次结构中继承并在子类中重写的优点。如果您必须支持传统的JUnit38类,这也是唯一可行的方法。

以下是一些用于执行自定义Runner的代码。关于getAppropriateRunnerForClass可能做什么,我实现它的方式是有一个单独的注释告诉自定义运行器运行什么。唯一的选择是来自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标签仅适用于整个班级。解决该限制的一种方法是将测试方法移动到静态内部类并注释它。这样,您就可以通过类的组织来进行注释。但是,这样做对任何@Before或@BeforeClass标记都无济于事,您将不得不在内部类中重新创建它们。它可以调用外部类的方法,但它必须有自己的方法作为钩子。

尝试 JUnit 测试组. 。来自文档:

@TestGroup("integration")
public class MyIntegrationTest {
   @ClassRule
   public static TestGroupRule rule = new TestGroupRule();

   ...
}
  • 执行一个简单的测试组:-Dtestgroup=集成
  • 执行多个测试组:-Dtestgroup=组1,组2
  • 执行所有测试组:-D测试组=全部

在JUnit 5中,你可以在类或方法级别声明 @Tag 来过滤测试;类似于TestNG中的测试组或JUnit 4中的类别

来自 javadoc

  

标签用于过滤为给定测试执行的测试   计划。例如,开发团队可以使用诸如此类的值来标记测试   如“快速”,“慢速”,“ci-server”等,然后提供标签列表到   用于当前的测试计划,可能依赖于   当前的环境。

例如,您可以使用&quot; slow&quot; @Tag 声明一个测试类,该类将继承所有方法,并在需要时覆盖某些方法:

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("slow") 
public class FooTest{

   // 
   @Test
   void loadManyThings(){ 
        ...
   }

   @Test
   void loadManyManyThings(){ 
        ...
   }


   @Test
   @Tag("fast")
   void loadFewThings(){ 
        ...
   }

}

您可以为其他测试类应用相同的逻辑。
通过这种方式,测试类(以及方法)也属于特定标记。

作为一种很好的做法,而不是在整个测试类中复制和粘贴 @Tag(“fast”) @Tag(“slow”),你可以创建自定义组合注释。
例如:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("slow")
public @interface Slow {
}

并将其用作:

@Test
@Slow
void slowProcessing(){ 
    ...
}   

要在文本执行期间启用或禁用标记有特定标记的测试,您可以依赖 maven-surefire-plugin文档

  

要包含标签或标签表达式,请使用 groups

     

要排除标记或标记表达式,请使用 excludedGroups

只需根据您的要求(文档示例)在您的pom.xml中配置插件:

 <build>
     <plugins>
         ...
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <version>2.22.0</version>
             <configuration>
                 <groups>acceptance | !feature-a</groups>
                 <excludedGroups>integration, regression</excludedGroups>
             </configuration>
         </plugin>
     </plugins> 
</build> 

有关信息,测试目标文档是没有更新。

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

您可以使用Test Suite( http: //qaautomated.blogspot.in/2016/09/junit-test-suits-and-test-execution.html )或者你可以使用Junit类别( http://qaautomated.blogspot.in/2016/09/junit-categories.html )有效地对您的测试用例进行分组。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top