1概要
この記事では、 JUnitParams ライブラリーとその使用法について調べます。簡単に言うと、このライブラリは JUnit テストのテストメソッドの簡単なパラメータ化を提供します。
複数のテスト間で変化する唯一のものがパラメータである状況があります。 JUnit 自体にパラメータ化サポートがあり、 JUnitParams はその機能を大幅に改善します。
2 Mavenの依存関係
このプロジェクトで JUnitParams を使用するには、それを pom.xml に追加する必要があります。
<dependency>
<groupId>pl.pragmatists</groupId>
<artifactId>JUnitParams</artifactId>
<version>1.1.0</version>
</dependency>
ライブラリの最新バージョンはhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22pl.pragmatists%22%20AND%20a%3A%22JUnitParams%22[ここ]にあります。 。
3テストシナリオ
2つの整数を安全に加算するクラスを作成しましょう。オーバーフローすると Integer.MAX VALUE が返され、アンダーフローすると Integer.MIN VALUE が返されます。
public class SafeAdditionUtil {
public int safeAdd(int a, int b) {
long result = ((long) a) + b;
if (result > Integer.MAX__VALUE) {
return Integer.MAX__VALUE;
} else if (result < Integer.MIN__VALUE) {
return Integer.MIN__VALUE;
}
return (int) result;
}
}
4簡単なテスト方法の構築
実装がすべての可能なシナリオに当てはまることを確認するために、入力値のさまざまな組み合わせについてメソッド実装をテストする必要があります。 JUnitParams は、パラメータ化されたテスト作成を実現するための複数の方法を提供します。
最小限のコーディングで基本的なアプローチを取り、それがどのように行われるかを見てみましょう。その後、JUnitParamsを使用してテストシナリオを実装する他の方法は____:
@RunWith(JUnitParamsRunner.class)
public class SafeAdditionUtilTest {
private SafeAdditionUtil serviceUnderTest
= new SafeAdditionUtil();
@Test
@Parameters({
"1, 2, 3",
"-10, 30, 20",
"15, -5, 10",
"-5, -10, -15" })
public void whenWithAnnotationProvidedParams__thenSafeAdd(
int a, int b, int expectedValue) {
assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b));
}
}
それでは、このテストクラスが通常の JUnit テストクラスとどう違うのかを見てみましょう。
最初に気付くのは、クラスアノテーション JUnitParamsRunner に 別のテストランナー があることです。
テストメソッドに移ると、テストメソッドには入力パラメータの配列を持つ @ Parameters アノテーションが付いています。それは私達のサービス方法をテストするために使われるであろう異なるテストシナリオを示します。
Mavenを使ってテストを実行すると、** 私たちは4つのテストケースを実行していて、1つのテストケースを実行しているのではないことがわかります。出力は次のようになります。
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.baeldung.junitparams.SafeAdditionUtilTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 sec
- in com.baeldung.junitparams.SafeAdditionUtilTest
Results :
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
5テストメソッドのさまざまな種類のパラメータ化
テストパラメータをアノテーションで直接提供することは、テストする必要がある可能性のあるシナリオが多数ある場合、確かに最も読みやすい方法ではありません。 JUnitParams は、パラメーター化されたテストを作成するために利用できる一連のさまざまなアプローチを提供します。
-
直接 @ Parameters アノテーション内(上記の例で使用されています)
-
アノテーション内で定義された名前付きテストメソッドを使う
-
テストメソッド名でマッピングされたメソッドを使う
注釈内で定義された名前付きテストクラス
-
CSVファイルを使う
アプローチを一つずつ探りましょう。
5.1. @ Parameters アノテーションに直接
私たちが試した例ではすでにこのアプローチを使っています。覚えておく必要があるのは、パラメータ文字列の配列を提供することです。パラメータ文字列内では、各パラメータはカンマで区切られています。
たとえば、配列は \ {"1、2、3"、 " - 10、30、20"} の形式になり、1セットのパラメータは "1、2、3" と表されます。
この方法の限界は、テストパラメータとしてプリミティブと __String __しか提供できないことです。テストメソッドのパラメータとしてオブジェクトを送信することもできません。
5.2. パラメータメソッド
クラス内の他のメソッドを使用してテストメソッドのパラメータを提供できます。まず例を見てみましょう。
@Test
@Parameters(method = "parametersToTestAdd")
public void whenWithNamedMethod__thenSafeAdd(
int a, int b, int expectedValue) {
assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b));
}
private Object[]parametersToTestAdd() {
return new Object[]{
new Object[]{ 1, 2, 3 },
new Object[]{ -10, 30, 20 },
new Object[]{ Integer.MAX__VALUE, 2, Integer.MAX__VALUE },
new Object[]{ Integer.MIN__VALUE, -8, Integer.MIN__VALUE }
};
}
テストメソッドは、メソッド parametersToAdd()、 に関して注釈が付けられ、参照されたメソッドを実行することによってパラメータを取得します。
プロバイダメソッドの仕様は結果として __Object __sの配列を返すべきです。指定された名前のメソッドが利用できない場合、テストケースはエラーで失敗します。
java.lang.RuntimeException: Could not find method: bogusMethodName so no params were used.
5.3. テストメソッド名でマッピングされたメソッド
@ Parameters アノテーションに何も指定しないと、 JUnitParams はテストメソッド名に基づいてテストデータプロバイダメソッドをロードしようとします。メソッド名は__ "parametersFor" + <test method name>のように構成されています。
@Test
@Parameters
public void whenWithnoParam__thenLoadByNameSafeAdd(
int a, int b, int expectedValue) {
assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b));
}
private Object[]parametersForWhenWithnoParam__thenLoadByNameSafe() {
return new Object[]{
new Object[]{ 1, 2, 3 },
new Object[]{ -10, 30, 20 },
new Object[]{ Integer.MAX__VALUE, 2, Integer.MAX__VALUE },
new Object[]{ Integer.MIN__VALUE, -8, Integer.MIN__VALUE }
};
}
上記の例では、テストメソッドの名前は whenWithnoParam shouldLoadByNameAbdSafeAdd()__です。
したがって、テストメソッドが実行されているときは、 parametersForWhenWithnoParam shouldLoadByNameAbdSafeAdd()__という名前のデータプロバイダメソッドを探します。
そのメソッドが存在するため、そこからデータをロードしてテストを実行します。
-
必要な名前に一致するようなメソッドがない場合、上記の例のようにテストは失敗します。
5.4. 注釈内で定義された名前付きテストクラス
前の例でデータプロバイダメソッドを参照した方法と同様に、テスト用のデータを提供するために別のクラスを参照することができます。
@Test
@Parameters(source = TestDataProvider.class)
public void whenWithNamedClass__thenSafeAdd(
int a, int b, int expectedValue) {
assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b));
}
public class TestDataProvider {
public static Object[]provideBasicData() {
return new Object[]{
new Object[]{ 1, 2, 3 },
new Object[]{ -10, 30, 20 },
new Object[]{ 15, -5, 10 },
new Object[]{ -5, -10, -15 }
};
}
public static Object[]provideEdgeCaseData() {
return new Object[]{
new Object[]{
Integer.MAX__VALUE, 2, Integer.MAX__VALUE },
new Object[]{
Integer.MIN__VALUE, -2, Integer.MIN__VALUE },
};
}
}
メソッド名が“ provide”で始まっていれば、クラス内にテストデータプロバイダをいくつでも持つことができます。もしそうであれば、executorはそれらのメソッドを選び、データを返します。
それらのメソッドが __Object __sの配列を返すとしても、その要件を満たすクラスメソッドがない場合、それらのメソッドは無視されます。
5.5. CSVファイルを使用する
テストデータをロードするために外部のCSVファイルを使用することができます。これは、可能なテストケースの数が非常に多い場合、またはテストケースが頻繁に変更される場合に役立ちます。テストコードに影響を与えずに変更を加えることができます。
テストパラメータを含む JunitParamsTestParameters.csv というCSVファイルがあるとします。
1,2,3
-10, 30, 20
15, -5, 10
-5, -10, -15
それでは、このファイルをテストメソッドのテストパラメータの読み込みに使用する方法を見てみましょう。
@Test
@FileParameters("src/test/resources/JunitParamsTestParameters.csv")
public void whenWithCsvFile__thenSafeAdd(
int a, int b, int expectedValue) {
assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b));
}
この方法の1つの制限は、複雑なオブジェクトを渡すことができないということです。プリミティブと __String __だけが有効です。
6. 結論
このチュートリアルでは、 JUnitParams の機能を簡単に説明する方法を説明しました。
また、JUnit自体ができることをはるかに超えて、テストメソッドにテストパラメータを提供するためにライブラリが提供するさまざまなアプローチについても説明しました。
いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testing[over on GitHub]にあります。