JUnit 数据验证 - 将多组 'expected' 数据发送到测试

JUnit data validation - send multiple sets of 'expected' data to a test

我正在考虑将预期的数据发送到构造函数中,但后来意识到这是一个愚蠢的想法。

我还是宁愿尽量减少打字。


我有一个扩展的 xml 配置文件。其中的某些元素可能会出现多次(ei,多个 channel 标签)。对于这些元素,我的计划是制作一个 'tester',可以调用它来验证每个单独的通道及其各自的值。我不知道如何使用 JUnit 执行此操作。

计划是有 2 个配置相反的配置文件。


参数化就是答案。谢谢

如果有人需要更多示例,这是我提出的示例:

@RunWith(Parameterized.class)
public class GlobalTester{
    @Parameter(0)
    public Configuration config;
    @Parameter(1)
    public boolean debug;

    @Parameters
    public static Collection<Object[]> params() throws Exception{
        List<Object[]> inputs = new LinkedList<Object[]>();

        Object[] o = new Object[2];
        o[0] = ConfigurationSuite.load(1);
        o[1] = true;
        inputs.add(o);

        o = new Object[2];
        o[0] = ConfigurationSuite.load(2);
        o[1] = false;
        inputs.add(o);

        return inputs;
    }

    @Test
    public void debug(){
        assertEquals(debug, config.getGeneral().isDebug());
    }
}

对测试用例使用多个参数的一种方法是使用 JUnit 提供的 Parameterized API。

这是一个示例,在同一测试用例中使用它时读取不同的 XML 文件。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class ConfigTest {

    private String xmlFile;

    public ConfigTest(String xmlFile) {
        this.xmlFile= xmlFile;
    }

    @Test
    public void testXml() throws Exception {
        System.out.println(xmlFile);
    }

    @Parameters
    public static Collection<String> data()  throws Exception{
        String file1 = new String(Files.readAllBytes(Paths.get(ConfigTest.class.getResource("config1.xml").toURI())));
        String file2 = new String(Files.readAllBytes(Paths.get(ConfigTest.class.getResource("config2.xml").toURI())));

        Collection<String> data = new ArrayList<String>();
        data.add(file1);
        data.add(file2);
        return data;

    }

}

这是使用参数化的一个很好的解决方案,但这样做会出现一个问题,如果我们想要其他测试用例,我们应该 运行 作为没有参数化的单独测试,那么我们不能做.

要解决该问题,我们可以使用 @Suite.SuiteClasses or @Enclosed

或者我们可以使用简单选项 @Theories 和 @DataPoint 的其他方式,这将是上述问题的简单解决方案。