質問
一部のグループのみを実行できるように、JUnitでテストをグループ化する方法はありますか?
または、いくつかのテストに注釈を付けて、それらをグローバルに無効にすることは可能ですか?
JUnit 4 を使用していますが、TestNGを使用できません。
編集: @RunWithおよび@SuiteClassesは素晴らしい働きをします。しかし、このようにテストクラスの一部のテストのみに注釈を付けることは可能ですか?または、テストクラス全体に注釈を付ける必要がありますか?
解決
テストクラス内でテストをグループ化しますか、それともテストクラスをグループ化しますか?後者を想定します。
テストの実行方法によって異なります。 Mavenで実行する場合、含めるテストを正確に指定できます。これについては、 Maven surefireドキュメントを参照してください。
ただし、より一般的には、テストスイートのツリーがあるということです。 JUnit 4のテストスイートは次のようになります。
@RunWith(Suite.class)
@SuiteClasses(SomeUnitTest1.class, SomeUnitTest2.class)
public class UnitTestsSuite {
}
つまり、FunctionTestsSuiteとUnitTestsSuiteがあり、その後、他の2つを含む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+)には2つの方法があります1つは、新しいメソッドassumeThatを使用することです。テストクラスの@BeforeClass(または@Before)にそれを配置し、条件が失敗した場合、テストを無視します。条件では、システムプロパティまたはグローバルにオンまたはオフに設定できる何かを配置できます。
他の方法は、グローバルプロパティを理解し、適切なランナーに委任するカスタムランナーを作成することです。このアプローチははるかに脆弱です(JUnit4の内部ランナーは不安定であり、リリースごとに変更できるため)が、クラス階層を継承してサブクラスでオーバーライドできるという利点があります。レガシーJUnit38クラスをサポートする必要がある場合、これを行う唯一の現実的な方法でもあります。
カスタムランナーを実行するためのコードを次に示します。 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);
}
}
EDIT:@RunWithタグはクラス全体に対してのみ機能します。その制限を回避する1つの方法は、テストメソッドを静的な内部クラスに移動して、注釈を付けることです。そうすれば、クラスの編成でアノテーションの利点が得られます。ただし、これを行っても@Beforeタグまたは@BeforeClassタグでは役に立たないため、内部クラスでこれらを再作成する必要があります。外部クラスのメソッドを呼び出すことができますが、フックとして独自のメソッドを持たなければなりません。
JUnitテストグループをお試しください。ドキュメントから:
@TestGroup("integration")
public class MyIntegrationTest {
@ClassRule
public static TestGroupRule rule = new TestGroupRule();
...
}
- 単純なテストグループを実行します:-Dtestgroup = integration
- 複数のテストグループを実行します:-Dtestgroup = group1、group2
- すべてのテストグループを実行:-Dtestgroup = all
JUnit 5では、クラスレベルまたはメソッドレベルで、テストをフィルタリングするための @Tag
を宣言できます。 TestNGのテストグループまたはJUnit 4のカテゴリに類似しています
タグは、特定のテストに対して実行されるテストをフィルタリングするために使用されます 計画。たとえば、開発チームは次のような値でテストにタグを付けることができます &quot; fast&quot;、&quot; slow&quot;、&quot; ci-server&quot;などとして、タグのリストを 現在のテスト計画に使用され、潜在的に 現在の環境。
たとえば、すべてのメソッドに継承される&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(&quot; fast&quot;)
と @Tag(&quot; slow&quot;)
をコピーして貼り付ける代わりに、次のことができます。カスタム合成アノテーションを作成します。
例:
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など)は、特定のパッケージに含まれるすべてのテストの実行をサポートしている場合があります。
テストスイートを使用できます( http: //qaautomated.blogspot.in/2016/09/junit-test-suits-and-test-execution.html )またはJunit Categories( http://qaautomated.blogspot.in/2016/09/junit-categories.html )を使用して、テストケースを効果的にグループ化します。