gpt4 book ai didi

java - 使用 JUnit 测试返回多个值的 API

转载 作者:行者123 更新时间:2023-12-02 10:58:27 25 4
gpt4 key购买 nike

我想测试一个 API,它接收一个参数并返回一组。该测试使用参数调用 API,并检查返回的集合是否包含预期值。

假设,我必须使用参数 arg1arg2arg3 测试 API,并检查值是否为 abc 出现在返回的集合中。也就是说,我的测试用例如下所示:

  • 使用 arg1 调用 API 并检查 a 是否为bc出现在返回的集合中。
  • 使用 arg2 调用 API 并检查 a 是否为bc出现在返回的集合中。
  • 使用 arg3 调用 API 并检查 a 是否为bc出现在返回的集合中。

如何使用 Junit 4 开发此测试用例?如果我必须添加 arg4 怎么办?如果我必须检查值 d 是否出现在返回的集合中怎么办?我可以从配置中读取参数列表和期望值吗?

最佳答案

流畅的断言

首先,使用FEST-Assertions库引入带有有意义的错误消息的美观断言:

assertThat(method(arg1)).containsExactly(a, b, c);
assertThat(method(arg2)).containsExactly(a, b, c);
assertThat(method(arg3)).containsExactly(a, b, c);

BDD 方式

但我知道你的问题不是关于语法,而是关于方法:如果arg4需要测试,你应该怎么做?好吧,如果 arg1 到 arg4 具有不同的语义,我建议您对每个参数进行单独的测试。 非常冗长,但也非常可读(伪代码):

@Test
public void shouldReturnAbcWhenSomeArgumentUsed() {
//given
Object arg = arg1;

//when
Set<Object> result = method(arg);

//then
assertThat(result).containsExactly(a, b, c);
}

..并对每个测试重复此操作。关键部分是:方法名应该代表参数的含义,这个方法实际测试什么,你期望什么,场景是什么?

考虑测试 isEven 方法。我建议进行以下测试:

  • shouldReturnTrueForZero
  • shouldReturnTrueForSmallPositiveEvenNumber
  • shouldReturnTrueForLargePositiveEvenNumber
  • shouldReturnFalseForSmallPositiveOddNumber
  • shouldReturnFalseForLargePositiveOddNumber
  • ...并镜像负数测试

每个测试都代表一个略有不同、定义明确的场景。另一方面,您可能会生成数千个 shouldReturnFalseWhen227,但是这样的测试套件除了很大之外还有什么值(value)呢?测试语义上不同的参数和极端情况,精确定义正在测试的情况。

参数化方式

如果您确实只想拥有一个通用测试方法,Parameterized运行者是必经之路。我认为这个例子是不言自明的。注意:您也可以参数化期望值。

@RunWith(value = Parameterized.class)
public class JunitTest6 {

private Object arg;

public JunitTest6(Object arg) {
this.arg = arg;
}

@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(
new Object[][]{
{arg1},
{arg2},
{arg3}
});
}

@Test
public void testMethod() {
assertThat(method(arg)).containsExcatly(a, b, c);
}

}

基于this .

关于java - 使用 JUnit 测试返回多个值的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6243242/

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