JUnit数据验证 - 发送多组'期望'数据到测试

时间:2015-10-15 21:03:33

标签: java unit-testing junit modular

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

我仍然宁愿尽量减少打字。

我有一个广泛的xml配置文件。其中的一些元素可能会出现多次(ei,多个channel标记)。对于那些元素,我的计划是制作一个“测试人员”。可以调用以验证每个单独的频道&各自的价值观。我不知道如何使用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());
    }
}

2 个答案:

答案 0 :(得分:1)

为测试用例使用多个参数的一种方法是使用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;

    }

}

答案 1 :(得分:0)

这是使用Parameterized的一个很好的解决方案,但是这会带来一个问题,如果我们要让其他测试用例在没有Parameterized的情况下作为单独的测试运行,那么我们就不能这样做。

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

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