在写测试的时候,我可能会遇到这样的情况,函数中存在下面这样两个三目运算,那么在写测试的时候为了 Cover 所有的情况,我们就需要写 4 个测试用例;每增加一个三目,测试就会增加一倍。产生大量的 Duplicate Code,每个测试明明也便成了问题。
newA = a ? "" : "1";
newB = b ? "" : "2";
那么怎样做不但能 Cover 所有的情况,还能减少 Duplicate Code 呢?
这个时候,我们就需要参数化测试。
以前我们写一个测试用例如下:
@Test
public void test_1() {
// ............
}
使用参数化测试,我们的测试用例如下:
@ParameterizedTest
@ValueSource(Strings = { "a", "b", "c"})
void test_2(String value) {
// ......
}
在上面的测试中,@ParameterizedTest
和 @Test
没有区别,其作用是一样的。@ValueSource
注解用来指定一个 String
数组作为参数源。
回到一开始的例子中,我们要测的是 a
和 b
的排列组合种情况,又该怎么传参数呢?
这个时候,我们使用注解 @MethodSource
,如下
static Stream<Arguments> testParams() {
return Stream.of(
Arguments.of(true, true, "", ""),
Arguments.of(true, false, "", "2"),
Arguments.of(false, true, "1", ""),
Arguments.of(false, false, "1", "2"),
);
}
@ParameterizedTest
@MethodSource("testParams")
void test_3(bool a, bool b, String newA, String newB) {
// ......
}
对就这样,当我们运行 test_3
后会显示 4
个测试的运行结果。其中,test_3
中的 4 个参数分别为:a 、b、newA 以及 newB 的值。此处,由于 newA 和 newB 的值是可变的,因此我们也将其配置在参数中,否则我们依旧需要在测试代码中写和源码中一样的三目来进行判断。
参数化测试不但满足了我们测试覆盖率的需求,还满足了我们减少 Duplicate Code 的需求。当然关于参数化测试还有好几类,涉及到好几个注解,在此就不一一列举了。
以后遇到这个重复的测试再也不用复制原来的测试用例了,再也不怕各种排列组合的测试会漏掉测试用例了。
The End ~
21 天写作训练,第 18 天 ing
网友评论