参数化的多层测试套件

10

我目前有一个抽象的BaseTest类,其中包含几个通用的@Test

public abstract class BaseTest {

    private String expected;
    private String actual;

    public BaseTest(String expected, String actual) {
        this.expected = expected;
        this.actual = actual;
    }

    public String methodToTest(String line) {
        return line.trim();
    }

    @Test
    public void testNull() {
        assertNull(methodToTest(null));
    }

    // more @Tests...
}

SomeTest 扩展了 BaseTest,在其中定义了各种测试案例。

@RunWith(Parallelized.class)
public class SomeTest extends BaseTest {
    // @Parameters (test cases) goes here...
}

我有很多测试,它们都扩展了BaseTest,然后我把它们放在RunAllTestsSuite中。

@RunWith(Suite.class)
@SuiteClasses({ SomeTest.class, AnotherTest.class, etc... })
public class RunAllTests { }

假设我想添加更多的@Test,但是我想将它们包含在另一个类中。

public class WhitespaceTest extends BaseTest {

    public WhitespaceTest(String expected, String actual) {
        super(expected, actual);
    }

    @Test
    public void testNewline() {
        assertEquals(expected, methodToTest(actual + "\n"));
    }

    // more @Tests...
}

看起来我需要另一个“层次结构”Suites以运行每个测试,这样对于RunAllTests中的每个类,我都要运行BaseTest WhitespaceTest。我该如何实现这个层次结构?


我不明白。为什么你不能把“WhitespaceTest”添加到你现有的测试套件中呢?当然,你也可以拥有多个测试套件。 - dkatzel
我想在当前测试套件中为每个“BaseTest”运行“WhitespaceTest”中的每个测试。 - budi
听起来更像是一个多继承问题,而不是一个套件问题。 - dkatzel
@CoronA 这里有很好的想法。一个问题,这是否意味着我必须将所有参数基本上合并到一个集合中? - budi
然而,你的目标对我来说不是很清楚,所以我无法提出解决方案。也许你想自己找到解决方案。那么,也许从 Junit Parameters 切换到 Junit Theories 会有所帮助。 - CoronA
显示剩余3条评论
1个回答

1

这是我目前(天真的)解决该问题的方法:

BaseTest 中:

@Test
public void testNewline() {
    WhitespaceTest wt = new WhitespaceTest(expected, actual);
    wt.testNewline();
}

这个方案可行,但是有很多重复的代码。在WhitespaceTest中每一个@Test,你都必须在BaseTest中再创建另一个@Test


我认为这样做不行:您使用一组参数(期望值,实际值)运行BaseTest。测试空格将需要另一组参数,而不是测试Null行为。也许这指向了您的BaseTest类的设计失败(它只是丢弃了期望/实际值)。 - CoronA
它能够工作,只是我不想要这种间接的层次。但是没错,我目前正在重新设计整个测试模块,以符合你上周所建议的。 - budi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接