1. 概要

オペレーティングシステムに依存し、テストマシンがLinuxで実行されている場合にのみ実行する必要があるコードのテストがあると想像してみてください。 他のOSで実行されている場合は、テストが失敗しないようにしますが、実行時には無視します。

最初のアプローチは、いくつかの if ステートメントを使用して、Systemクラスのプロパティを使用してこの状態をチェックすることです。 もちろんこれは機能しますが、JUnitにはよりクリーンでエレガントな方法があります。

この短いチュートリアルでは、仮定クラスを使用してJUnit4でテストを条件付きで実行または無視する方法を見ていきます。

2. 仮定クラス

このクラスは、特定の条件に基づく条件付きテストの実行をサポートする一連のメソッドを提供します。 テストは、これらすべての条件が満たされた場合にのみ実行されます。 そうでない場合、 JUnitはその実行をスキップし、テストレポートで合格としてマークします。 後者はAssertクラスとの主な違いであり、失敗した状態ではテストがfailingとして終了します。

注意すべき重要な点は、 Assumeクラスについて説明した動作は、デフォルトのJUnitランナー専用であるということです。 カスタムランナーでは、状況が異なる場合があります。

最後に、 Assert の場合と同じように、@Beforeまたは@BeforeClass注釈付きメソッドのいずれかでAssumeメソッドを呼び出すことができます。または@Testメソッド自体の中で。

次に、いくつかの例を示して、Assumeクラスの最も便利なメソッドを見ていきましょう。 以下のすべての例で、 getOsName()Linuxを返すと仮定します。

2.1. assertThatを使用する

assertThat()メソッドは、状態(この場合は getOsName())が渡されたマッチャーの条件を満たすことを確認します。

@Test
public void whenAssumeThatAndOSIsLinux_thenRunTest() {
    assumeThat(getOsName(), is("Linux"));

    assertEquals("run", "RUN".toLowerCase());
}

この例では、 getOsName()がLinuxと等しいかどうかを確認しました。 getOsName()がLinuxを返すと、テストが実行されます 。 ここでは、マッチャーとして Hamcrest matcherメソッドis(T)を使用していることに注意してください。

2.2. assumeTrueを使用する

同様に、 assertTrue()メソッドを使用して、テストを実行するためにtrueと評価する必要があるブール式を指定できます。 false と評価された場合、テストは無視されます。

private boolean isExpectedOS(String osName) {
    return "Linux".equals(osName);
}

@Test 
public void whenAssumeTrueAndOSIsLinux_thenRunTest() {
    assumeTrue(isExpectedOS(getOsName()));
 
    assertEquals("run", "RUN".toLowerCase());
}

この場合、 isExpectedOs()はtrueを返します。 したがって、テストを実行するための the 条件が満たされ、テストが実行されます

2.3. assertFalseを使用する

最後に、反対の assertFalse()メソッドを使用して、テストを実行するためにfalseと評価する必要があるブール式を指定できます。 true と評価された場合、テストは無視されます。

@Test
public void whenAssumeFalseAndOSIsLinux_thenIgnore() {
    assumeFalse(isExpectedOS(getOsName()));

    assertEquals("run", "RUN".toLowerCase());
}

この場合、 isExpectedOs()また trueを返すため、テストの条件が返されます実行する条件が満たされておらず、テストは無視されます

2.4. assertNotNullを使用する

ある式がnullである場合にテストを無視したい場合、assumeNotNull()メソッドを使用できます。

@Test
public void whenAssumeNotNullAndNotNullOSVersion_thenRun() {
    assumeNotNull(getOsName());

    assertEquals("run", "RUN".toLowerCase());
}

getOsName()がnull以外の値を返しているため、テストを実行するための条件が満たされ、テストが実行されます。

2.5. assertNoExceptionを使用する

最後に、例外がスローされた場合、テストを無視することができます。 この目的のためにassumeNoException()を使用できます。

@Test
public void whenAssumeNoExceptionAndExceptionThrown_thenIgnore() {
    assertEquals("everything ok", "EVERYTHING OK".toLowerCase());
    String t=null;
    try {
        t.charAt(0);
    } catch(NullPointerException npe){
        assumeNoException(npe);
    }
    assertEquals("run", "RUN".toLowerCase());
}

この例では、 tnullであるため、 NullPointerException例外がスローされます。したがって、 テストを実行するための条件満たされていないため、テストは無視されます

3. assertXXX の電話はどこに置くべきですか?

assumeXXXメソッドの動作は、テストのどこに配置するかによって異なることに注意してください

assumeThat の例を少し変更して、 assertEquals()呼び出しが最初になるようにします。 また、 assertEquals()を失敗させましょう。

@Test
public void whenAssumeFalseAndOSIsLinux_thenIgnore() {
    assertEquals("run", "RUN");
    assumeFalse(isExpectedOS(getOsName()));
}

この例を実行すると、次のようになります。

org.junit.ComparisonFailure: 
Expected :run
Actual   :RUN

この場合、assumeThat()呼び出しに到達する前にテストが失敗したため、テストは無視されません。すべてのassertXXXメソッドで同じことが起こります。 したがって、テストメソッド内の適切な場所に配置されていることを確認する必要があります。

4. 結論

この短いチュートリアルでは、JUnit4のAssume クラスを使用して、テストを実行するかどうかを条件付きで決定する方法を説明しました。 JUnit 5を使用している場合は、バージョン5.4以降でも使用できます。

いつものように、私たちが経験した例のソースコードは、GitHubにあります。