我有一个抽象的测试用例“AbstractATest”用于接口“A”。它有几种测试方法(@Test)和一种抽象方法:
protected abstract A unit();
提供正在测试的单元。不,我有多个“A”的实现,例如“DefaultA”,“ConcurrentA”等。
我的问题: 测试用例很大(~1500 loc)并且它正在增长。所以我想把它分成多个测试用例。如何在Junit 4中组织/构建它,而无需为每个实现和抽象测试用例提供具体的测试用例。
我想要,例如“AInitializeTest”,“AExectueTest”和“AStopTest”。每个都是抽象的并包含多个测试。但对于我的具体“ConcurrentA”,我只想要一个具体的测试用例“ConcurrentATest”。
我希望我的“问题”很明确。
修改
看起来我的描述不是 clear
是否可以传递参考测试?
我知道参数化测试,但这些需要静态方法,这不适用于我的设置。抽象测试用例的子类决定参数。
答案 0 :(得分:0)
为什么不让每个具体的测试用例通过一个名为via @Before
的方法初始化一个具体的测试实例。即,您将每个测试的具体实例之前的新实例初始化。然后,抽象测试类可以提供处理此实例的测试(通过抽象类中的受保护字段引用)。
因此,每个具体实例都有一个测试类,这些测试类只提供一个新的实例来测试。这些派生的抽象测试类提供了所有测试。当您创建新的具体类型时,您只需要一个新的具体测试类来实例化该类的实例。
答案 1 :(得分:0)
您可以向测试方法引入一个参数,并使用一个@DataProvider创建要测试的所有类的实例。好的,一次性测试。
答案 2 :(得分:0)
我不知道你是否已经解决了这个问题,但是我建议你保留一个抽象测试,但要在该抽象类中外化方法的实现。
例如,使用Initialize tests
创建一个类public class InitializeTester {
protected static void testInitializeA(A unit) {
...
assertSomething ...
}
protected static void testInitializeB(A unit) {
...
assertSomething ...
}
}
带有执行测试的班级:
public class ExecuteTester {
protected static void testExecuteA(A unit) {
...
assertSomething ...
}
protected static void testExecuteB(A unit) {
...
assertSomething ...
}
}
然后你的实际抽象测试员:
public abstract class ATester {
@Test
public void testInitializA() {
InitializeTester.testInitializeA(unit());
}
@Test
public void testInitializB() {
InitializeTester.testInitializeB(unit());
}
@Test
public void testExecuteA() {
testExecuteTester.testExecuteA(unit());
}
@Test
public void testExecuteB() {
testExecuteTester.testExecuteB(unit());
}
abstract protected A unit();
}
你最终可能会得到有很多方法的抽象测试类,但是它们都会很短,因为它们会将控制传递给你的Tester类。