JUnit5概要
個人的にはテスティングフレームワークはSpockの方が好みですがJUnitについてもまとめようと思います。
java言語で書くことの出来る単体テストを行うためのテスティングフレームワークです。
Spockとは異なり、javaソースコードとほとんど一緒なのでjavaに触れてきた方はこちらの方が親しみがあり、ラムダ式の判定などもでき、springとの相性も良いみたいです。
JUnit5の基本的なルール
・戻り値はVoid(戻り値なし)とする
・引数は指定しない
JUnitは下記のようにアノテーションベースのテスティングフレームワーク
アノテーション | 概要 |
---|---|
@Test | 付与することでテストメソッドとして機能 |
@DisplayName | テスト実行結果に表示される-結果が分かりやすくなる |
@BeforeEach | テストメソッドとは別で作成しておくことで、各テストメソッドの実行後に毎回実行される |
@AfterEach | テストメソッドとは別で作成しておくことで、各テストメソッドの実行前に毎回実行される |
@BeforeAll | テストメソッドとは別で作成しておくことで、テストクラスの実行前に1度だけ実行される |
@AfterAll | テストメソッドとは別で作成しておくことで、テストクラスの実行前に1度だけ実行される |
@Disabled | 付与したテストクラスやテストメソッドを無効化 |
@ParameterizedTest | 付与することでパラメータ化テストが可能 |
@ValueSource | パラメタライズド用のテストメソッド(ひとつの型のみ使用可能) |
@MethodSource | パラメタライズド用のテストメソッド(複数の型の使用可能) |
@CsvSource | パラメタライズド用のテストメソッド(独自の型でも使用可能) |
参考コードを実際に書いてみる
前提:
下記のDTOクラスの各フィールドが取得できるかテストを行う。
◆DTOクラス
public class dogDto {
private Long dogId;
private String DogName;
private String DogBreed;
}
◆テストコード
@SpringBootTest
public class dogDaoImplSTest_Select {
@Autowired
DogDaoImpl dao;
static Stream<Arguments> parameterized_method() { //パラメーターを渡すメソッド
return Stream.of(
arguments(1L, 1L, "moku", "pomeranian"), //パラメーター1を渡す
arguments(2L, 2L, "mugi", "pekingese") //パラメーター2を渡す
);
}
@DisplayName("複数件取得") //テスト実行時に表示するテスト名
@ParameterizedTest //パラメーター化テストに付与
@MethodSource("parameterized_method")
//上記のメソッドの呼び出し
//様々な型を渡すことができる、上記でメソッドを作成する必要がある
void select_parameterized_dog(Long pDogId, Long eDogId, String eDogName, String EDogBreed) { //メソッド内で渡すための変数宣言
final DogDtoSelector selector = new DogDtoSelector();
selector.setDogId(List.of(pDogId));
final List<DogDto> actual = dao.select(selector); //selectメソッドの実行
assertEquals(1, actual.size()); //サイズチェック
assertAll( //各パラメーターのチェック
() -> assertEquals(eDogId, actual.get(0).getDogId()),
() -> assertEquals(eDogName, actual.get(0).getDogName()),
() -> assertEquals(EDogBreed, actual.get(0).getDogBreed())
);
}
}
メリット
・javaの記法でそのまま書くことができる
・パラメタライズドテストの際に様々な型で検証を行うことができる
・SpringBootとの親和性が高い
デメリット
・パラメタライズドテストに関してはspockの方がわかりやすい
まとめ
個人的にはSpockの方が好みですが、Spockのパラメタライズドテストを行う際にも、独自の型などを使用していると、別メソッドとして切り出してパラメーターを渡してあげる必要があるのでどっちもどっちといったところかなと思っています。
javaに慣れている方はJUnitの方がわかりやすいかもしれないですね。