使资源 xml 可配置,同时在 Java 中进行测试



>我必须测试超过100 +不同的情况,对于每种情况,我都需要读取和解析的外部xml。我使用:

String xml = IOUtils.toString(
                this.getClass().getResourceAsStream(path),encoding);

例如我的测试 xml:

<container xmlns:dmc="http://example.com/common">
    <object id="1369" checkedParamter="in" class="Class1">
...
</object>
</container>

但是我必须使用有效 id 、缺少 id、使用现有 id 进行测试。然后我需要检查Paramter有3-4个值,并将所有组合与id属性组合在一起。现在对于每个测试,我都会创建新的xml,唯一的区别是这两个属性idcheckedParamter。我想知道是否有简单的方法来读取 xml 并使用相同的结构,但从我的测试中传递这些值。

 <container xmlns:dmc=" http://example.com/common">
        <object id= ${valueId} checkedParamter=${valueChechedParamter} class="Class1">
    ...
    </object>
    </container>

然后,我将使用一个xml,并将期望值放在测试的开头。我没有技术或方法可以做到这一点?

最好的方法是有一个单独的文件,其中包含 ${valueId} ,就像您已经拥有的那样。

我们将使用 JUnit 的以下功能来实现我们的目标:

  • 参数化测试 - 用于传入数据的简单列表

我们将以下文件存储到项目的resources部分:

<container xmlns:dmc=" http://example.com/common">
    <object id= ${valueId} checkedParamter=${valueChechedParamter} class="Class1">
        ...
    </object>
</container>

然后我们开始测试:

@RunWith(Parameterized.class)
public class XmlInputTest {
@Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
                 { 1369, "in" }, 
                 { 1369, "out" }, 
                 { 753, "in" }, 
                 // etc.... 
           });
    }

@Parameter(value = 0)
public int id;
@Parameter(value = 1)
public String checkedParamter;
@Test
public void mainTest() {
    String xml = IOUtils.toString(
         this.getClass().getResourceAsStream("template.xml"),encoding);
    xml = xml.replace("${valueId}",String.valueOf(id)).replace("${valueChechedParamter}",checkedParamter);
    // remaing test....
}
}

使用这种测试运行方法的优点是,您有一个简单的要测试的输入列表。

您可以在测试开始时尝试这样的事情。

Map<String,String> properties = new HashMap<String, String>();
properties.put("valueId", "1");
properties.put("valueChechedParamter", "0");
String propertyRegex = "\$\{([^}]*)\}";
Pattern pattern = Pattern.compile(propertyRegex);
int i = 0;
Matcher matcher = pattern.matcher(xml);
StringBuilder result = new StringBuilder(xml.length());
while(matcher.find()) {
    result.append(expression.substring(i, matcher.start()));
    String property = matcher.group();
    property = property.substring(2, property.length() - 1);
    if(properties.containsKey(property)) {
        property = properties.get(property);
    } else {
        property = matcher.group();
    }
    result.append(property);
    i = matcher.end();
}
result.append(expression.substring(i));
String resultXml = result.toString();

相关内容

  • 没有找到相关文章

最新更新