如何在JUnit中拆分抽象测试用例?

时间:2010-02-17 21:58:27

标签: java unit-testing testing junit junit4

我有一个抽象的测试用例“AbstractATest”用于接口“A”。它有几种测试方法(@Test)和一种抽象方法:

protected abstract A unit();

提供正在测试的单元。不,我有多个“A”的实现,例如“DefaultA”,“ConcurrentA”等。

我的问题: 测试用例很大(~1500 loc)并且它正在增长。所以我想把它分成多个测试用例。如何在Junit 4中组织/构建它,而无需为每个实现和抽象测试用例提供具体的测试用例。

我想要,例如“AInitializeTest”,“AExectueTest”和“AStopTest”。每个都是抽象的并包含多个测试。但对于我的具体“ConcurrentA”,我只想要一个具体的测试用例“ConcurrentATest”。

我希望我的“问题”很明确。

修改
看起来我的描述不是 clear 是否可以传递参考测试?
我知道参数化测试,但这些需要静态方法,这不适用于我的设置。抽象测试用例的子类决定参数。

3 个答案:

答案 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类。