我想为我的代码库提供“多态”测试用例。具体地说,将有多个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());
}
但是JUnit的构建方式阻碍了我完成这个计划。
所以基本上我想给我的测试提供一个多参数的笛卡尔乘积。是否可以使用开箱即用的参数提供程序(ValueSource
、NullSource
等)或者我需要在@MethodSource
的帮助下强制设置定制的服务
发布于 2019-06-11 01:51:49
在您的示例中,您还可以考虑使用基于属性的测试框架,如jqwik。它的第一种用法与您的示例非常相似:
import net.jqwik.api.*;
import static org.junit.jupiter.api.Assertions.*;
@Property(generation = GenerationMode.EXHAUSTIVE)
void testInsertDeleteNode(
@ForAll("graphFactory") Graph g,
@ForAll("ints") 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());
}
@Provide
Arbitrary<Graph> graphFactory() {
return Arbitraries.of(new ALGraph(), new AMGraph());
}
@Provide
Arbitrary<Integer> ints() {
return Arbitraries.of(0, 31415, -31415);
}
通过使用generation = GenerationMode.EXHAUSTIVE
,您可以告诉引擎生成可能参数值的笛卡尔乘积。事实上,如果组合的数量是<= 1000jqwik,那么它本身就会选择cartesion产品。
根据不同图实现的数量,您还可以考虑一种方法,为每个实现使用具体的子类,并在接口(或抽象超类)中指定测试本身:
interface GraphTest<G extends Graph> {
G createGraph();
@Property(generation = GenerationMode.EXHAUSTIVE)
default void testInsertDeleteNode(@ForAll("ints") Integer v) {
Graph g = createGraph();
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());
}
@Provide
default Arbitrary<Integer> ints() {
return Arbitraries.of(0, 31415, -31415);
}
}
class ALGraphTest implements GraphTest<ALGraph> {
@Override
public ALGraph createGraph() {
return new ALGraph();
}
}
class AMGraphTest implements GraphTest<AMGraph> {
@Override
public AMGraph createGraph() {
return new AMGraph();
}
}
由于您已经在使用jqwik5平台,因此使用JUnit需要一个single additional dependency。
https://stackoverflow.com/questions/56526807
复制相似问题