はじめに
テストを書いていると、「このケースは今の実装では失敗するけれど、バグの再現例としてコードに残しておきたい」という場面があります。
私が保守している機能の中には、テストパターンがほぼ無限にあるものがあります。見つかったバグの再現ケースをテストコードに残しておけば、コードを読む人やAIに既知の問題を伝えられます。一方で、失敗するテストをそのままにすると、CI(継続的インテグレーション)のテストが失敗し続けてしまいます。
JUnit 5では、@Disabledを付けることでテストメソッドやテストクラスを実行対象から外せます。この記事では基本的な使い方と、無効化したテストを扱うときの注意点を紹介します。
テストメソッドを無効化する
テストメソッドに@Disabledを付けると、そのメソッドは実行されません。引数に理由を指定すると、テスト結果のレポートなどで無効化の理由を確認できます。
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class SampleTest {
@Test
@Disabled("不具合修正後に有効化する")
void testToBeSkipped() {
// このテストは実行されない
}
}
この例ではtestToBeSkippedだけが無効になります。同じクラスにあるほかのテストメソッドは、通常どおり実行されます。
テストクラス全体を無効化する
クラスに@Disabledを付けると、そのクラスに含まれるテストが実行対象から外れます。
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@Disabled("このテストクラスは現在メンテナンス中")
class SampleTest {
@Test
void testA() {
// 実行されない
}
@Test
void testB() {
// こちらも実行されない
}
}
クラス単位で無効化すると、あとから追加したテストも含めて実行対象外になります。クラス全体を止める必要があるかは、メソッド単位の無効化と比べて慎重に判断しましょう。
JUnit 4の@Ignoreとの違い
JUnit 4では@Ignore、JUnit Jupiterでは@Disabledを使います。
無効化したテストを残すときの注意点
@Disabledは、テストを削除せずに実行対象から外せる便利な機能です。失敗するケースを不具合の再現例として残しておけば、コードを読む人やAIに、既知の問題を伝えやすくなる場合もあります。
ただし、無効化したテストは実行されないため、実装や仕様が変わってもテストが正しいままか確認されません。無効化した状態が長く続くと、テストが古くなったり、なぜ残しているのか分からなくなったりします。
そのため、次の点を意識すると管理しやすくなります。
-
@Disabledの理由を具体的に書く - 関連する課題やチケットがある場合は、その識別子も記載する
- 再有効化する条件や担当を明確にする
- 恒久的に不要なテストであれば、無効化したまま残さず削除を検討する
特に、失敗するテストを不具合情報として残す場合は、テスト名やアサーションから「どのような挙動が問題なのか」が読み取れるようにしておくと、意図が伝わりやすくなります。
まとめ
JUnit 5のJUnit Jupiterでテストを一時的に無効化するには、@Disabledを使います。
- テストメソッドに付けると、そのメソッドだけが実行対象外になる
- テストクラスに付けると、そのクラス内のテストが実行対象外になる
- 無効化する理由を指定できる
- 無効化したテストは実行されないため、理由と再有効化の方針を管理する
失敗するテストをコードに残したいときは、@DisabledでCIへの影響を避けられます。ただし、無効化は一時的な措置として扱い、あとから有効化または削除するタイミングを決めておきましょう。