我想为我的代码库提供“多态”测试用例。具体来说,一个Graph接口将有多个实现,并希望为所有这些实现重用测试代码 ( ALGraph, AMGraph, ...)。
我想按照以下几行开发我的测试方法
@ParameterizedTest
@MethodSource("graphFactory")
// Note: JUnit 5 won't allow the following additional argument source
@ValueSource(ints = {0, 31415, -31415})
void testInsertDeleteNode(Graph g, Integer v) {
g.insertNode(new Node<>(v));
assertTrue(g.containsNode(new Node<>(v)));
assertEquals(1, g.vertices().size());
g.deleteNode(new Node<>(v));
assertFalse(g.containsNode(new Node<>(v)));
assertEquals(0, g.vertices().size());
}
Run Code Online (Sandbox Code Playgroud)
但是 JUnit 的构建方式阻止了我完成这个计划。
所以基本上我想为我的测试提供多个参数的笛卡尔积。使用开箱即用的参数提供程序 ( ValueSource, NullSource, ...)是否可行,或者我是否需要借助 强行设置自定义参数提供程序@MethodSource?
从 v1.0.0 开始,@CartesianProductTest作为JUnit 5的JUnit Pioneer扩展包的一部分提供。在https://junit-pioneer.org/docs/cartesian-product 中查找详细信息
它不受开箱即用的支持 - 但在https://github.com/junit-team/junit5/issues/1427 上已经存在一个功能请求
在此处查找示例和概念解决方案证明:https : //github.com/junit-team/junit5-samples/tree/master/junit5-jupiter-extensions
@CartesianProductTest({"0", "1"})
void threeBits(String a, String b, String c) {
int value = Integer.parseUnsignedInt(a + b + c, 2);
assertTrue((0b000 <= value) && (value <= 0b111));
}
@CartesianProductTest
@DisplayName("S ? T ? U")
void nFold(String string, Class<?> type, TimeUnit unit, TestInfo info) {
assertTrue(string.endsWith("a"));
assertTrue(type.isInterface());
assertTrue(unit.name().endsWith("S"));
assertTrue(info.getTags().isEmpty());
}
static CartesianProductTest.Sets nFold() {
return new CartesianProductTest.Sets()
.add("Alpha", "Omega")
.add(Runnable.class, Comparable.class, TestInfo.class)
.add(TimeUnit.DAYS, TimeUnit.HOURS);
}
Run Code Online (Sandbox Code Playgroud)
产生一个测试计划,如:
| 归档时间: |
|
| 查看次数: |
4503 次 |
| 最近记录: |