私は、テストケースが含まれている巨大なJSON-ファイルを持っています。罰金に動作します - 私は私のJUnitテストにJSONファイルを解析(ノー私はそれがファイルを知って、この場合には問題ないので、ここでそれを表示したくありません)。しかし、私は50のテストケースを持っていると私は次のようにJUnitの各を表示したい場合:「50からテスト0が合格」などのリストがあります:渡されたテスト1、テスト2テスト3が失敗し、渡されました。..
私は、メソッドに、各テストケースを配置する必要があります。私は、動的にこれをどのように行うことができますか?これはJUnitのでは可能ですか?私はJSONを解析していたとき、私は私が持っているどのように多くの例を知っているわけではないので。
JUnitは、インポートおよび使用して簡単に使用できることを意味し、CSVファイルを直接サポートしてい@CSVFileSource
。
あなたの場合は、CSVファイルを必要としないので、私は、JSONファイルを使用してJUnitの5のパラメータ化テストを作成しようとしました。
テスト中の私たちのクラス。
public class MathClass {
public static int add(int a, int b) {
return a + b;
}
}
ここで私が使用していますJSONファイルです。
[
{
"name": "add positive numbers",
"cases": [[1, 1, 2],[2, 2, 4]]
},
{
"name": "add negative numbers",
"cases": [[-1, -1, -2 ], [-10, -10, -20 ]]
}
]
だから、JUnitの5に呼び出されたアノテーションがあり@MethodSource
、あなたのパラメータ化テストに引数を提供する機会を与えてくれます。あなただけのメソッド名を提供する必要があります。ここに私の引数プロバイダメソッドです。
@SneakyThrows
private static Stream<TestCase> getAddCases() {
final ObjectMapper mapper = new ObjectMapper();
TypeReference<List<Case>> typeRef = new TypeReference<>() {};
final File file = new File("src/test/resources/add-cases.json");
final List<Case> cases = mapper.readValue(file, typeRef);
return cases.stream()
.flatMap(caze -> caze.getCases()
.stream()
.map(el -> new TestCase(caze.getName(), el)));
}
上記のコードでは、クラスCase
と呼ばれるクラスが存在し、各テストケースを表すために、JSONオブジェクトからJavaオブジェクトへと「ケース」フィールドは、多次元配列であるので、マッピングするために使用されますTestCase
。(全体的に、あなたはすでにそれを解析することができますので、これは、あなたのために重要ではありませんが、私はとにかくそれをここに置くことを望んでいました)。
最後に、試験方法そのもの。
@ParameterizedTest(name = "{index} : {arguments}")
@MethodSource("getAddCases")
void add_test(TestCase testCase) {
final List<Integer> values = testCase.getValues();
int i1 = values.get(0);
int i2 = values.get(1);
int e = values.get(2);
assertEquals(e, MathClass.add(i1, i2));
}
@ParametrizedTest
注釈は取るname
あなたは、テストの名前のテンプレートを提供することができ、引数を。私はちょうどで遊んtoString
方法TestCase
各テストケースのためのより良い説明を達成するためのクラス。
@Override
public String toString() {
return String.format("%s : (%s, %s) ==> %s", name, values.get(0), values.get(1), values.get(2));
}
出来上がり!