敏捷 ALM - 使用 XStream 进行数据驱动测试
敏捷 ALM 的章节摘录
![]() |
敏捷ALM 作者:Michael Hüttermann XStream是一个XML序列化和反序列化工具。在本文中,基于敏捷ALM的第8章,作者Michael Hüttermann讨论了当您需要从XML结构中获取对象或反之亦然时,如何使用XStream。 |
XStream 是一个 XML 序列化器和反序列化器。它可以用于各种需要从 XML 结构获取对象或反之亦然的情况。它易于使用,并且 XML 非常干净。
如果您在 Java 中定义扁平对象的测试数据,您需要编写一些粘合代码。如果您需要定义对象树,您很快会意识到 Java 是错误的语言,并且初始化每个子对象、设置值并将它们分配给父对象会非常耗时。如果您在应用程序的几个地方需要它,这可能没问题,但如果存在预定义的对象层次结构,您应该提取它们。 XML 结构是我们可以描述对象层次结构的一种方式。 事实上,这是一种非常常见的方法,因为有很多可用的工具,您不需要担心使用错误的字符集。
让我们尝试一个简单的例子。首先,将 XStream 依赖项添加到您的 pom.xml 中
<dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.3.1</version> </dependency>
现在,让我们编写一个简单的 Java Bean
public class User {
private String firstName;
private String lastName;
public User(String firstName, String lastName) {
this.lastName = lastName;
this.firstName = firstName;
}
...
}
要使用 XStream 序列化用户,我们可以使用 XStream 的 API,如下所示
XStream xstream = new XStream();
User user = new User("Paul", "Breitner");
String xml = xstream.toXML(user);
根据您在 Java 类中使用的包名,结果类似于这样:
<org.agile.alm.entities.User> <firstName>Paul</firstName> <lastName>Breitner</lastName> </org.agile.alm.entities.User>
正如您所看到的,XML 文件中存在一些包定义。如果您想要一个更干净的 XML 结构,您可以在 XStream 中定义所谓的别名。您可以将别名定义为注释或特殊定义。如果您可以控制您的对象,那么注释是一种非常方便的方式来编写和忘记别名,尤其是在您在不同的代码位置多次使用该对象时。使用已定义的别名进行序列化如下所示
XStream xstream = new XStream();
xstream.alias("user",User.class);
User user = new User("Paul", "Breitner");
String xml = xstream.toXML(user);
使用 XStream 注释的操作如下所示
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("user")
public class User {
private String firstName;
private String lastName;
...
}
在 Java 代码中,基于注释的序列化如下所示
XStream xstream = new XStream();
xstream.processAnnotations(User.class);
User user = new User("Paul", "Breitner");
String xml = xstream.toXML(user);
对于从 XML 反序列化对象,您必须按照以下方式进行
<user> <firstName>Paul</firstName> <lastName>Breitner</lastName> </user>
如果您有更大的对象树用于反序列化,它会变得更有帮助。通常,您的模型的对象已经定义。使用 XStream,您可以使用复杂的对象来驱动您在 TestNG 中的 dataProvider。
现在让我们回到 TestNG。要使用您的对象列表作为 dataProvider,您可以使用一个辅助函数将其转换为数组数组,如列表 1 所示。
列表 1 TestNG 测试类通过 XStream 从 XML 读取数据
import org.agile.alm.entities.User;
import com.thoughtworks.xstream.XStream;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMe {
…
protected <T> List<T> readListData(String filename) { #A
return (List<T>) xstream.fromXML(this.getClass().getClassLoader().
getResourceAsStream(filename));
}
public static <T> Object[][] getObjectArray(List<T> elements) { #1
Object[][] values = new Object[elements.size()][1];
int counter = 0;
for (T t : elements) {
values[counter][0] = t;
counter++;
}
return values;
}
@DataProvider(name = "users")
public Object[][] createData() {
List<User> users = readListData("users.xml");;
return getObjectArray(users); #B
}
…
}
#A Reads the XML with XStream
#1 Transforms list into an array of array
#B Returns data for the tests
将列表转换为数组数组 (#1) 的目的是为了适应 TestNG 的 dataProvider 格式。
摘要
在数据驱动的 functional 测试中,重用您的模型会非常方便。您希望在您的用户界面中检查十个或更多参数。参数列表变得更加复杂,并导致大量工作。如果您围绕您的模型构建您的用户界面,那么这就是您应该走的路。 XStream 使您可以非常轻松地填写模型的重要部分。
![]() |
变得敏捷 |
![]() |
通过示例进行规范 |
![]() |
企业搜索实战
|