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 的其他方式,这将是上述问题的简单解决方案。
我正在考虑将预期的数据发送到构造函数中,但后来意识到这是一个愚蠢的想法。
我还是宁愿尽量减少打字。
我有一个扩展的 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 的其他方式,这将是上述问题的简单解决方案。