gpt4 book ai didi

java - 如何从 JSON 生成多个测试方法?

转载 作者:行者123 更新时间:2023-12-02 08:53:12 28 4
gpt4 key购买 nike

我有一个巨大的 JSON 文件,其中包含测试用例。 (不,我不想在这里显示它,因为在这种情况下知道该文件并不重要)我将 json 文件解析为我的 junit 测试 - 效果很好。但我有 50 个测试用例,如果我想在 Junit 中显示每个测试用例,例如:“test 0 from 50 pass”并有一个列表,例如:测试 1 通过,测试 2 通过,测试 3 失败..

我必须将每个测试用例放入一个方法中。我怎样才能动态地做到这一点?这在 Junit 中可能吗?因为当我解析 json 时,我不知道我有多少个案例。

最佳答案

JUnit 直接支持 CSV 文件,这意味着您可以使用 @CSVFileSource 轻松导入和使用它们。

但是,由于您的案例不涉及 CSV 文件,因此我尝试使用 JSON 文件在 JUnit 5 中创建参数化测试。

我们的类(class)正在接受测试。

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 对象,并且由于“cases”字段是一个多维数组,因此有一个类来表示每个测试用例称为测试用例。 (总的来说,这对你来说并不重要,因为你已经能够解析它,但我还是想把它放在这里)。

最后是测试方法本身。

    @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 参数,您可以在其中提供测试名称的模板。我只是使用了 TestCase 类的 toString 方法来更好地描述每个测试用例。

@Override
public String toString() {
return String.format("%s : (%s, %s) ==> %s", name, values.get(0), values.get(1), values.get(2));
}

瞧!

Test cases

关于java - 如何从 JSON 生成多个测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60652690/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com