65.9K
CodeProject 正在变化。 阅读更多。
Home

敏捷 ALM - 使用 XStream 进行数据驱动测试

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (2投票s)

2011年6月24日

CPOL

3分钟阅读

viewsIcon

10812

敏捷 ALM 的章节摘录

image002.jpg 敏捷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 使您可以非常轻松地填写模型的重要部分。

您可能还会对以下 Manning 图书感兴趣:

image003.jpg

变得敏捷
…在一个不完美的世界
Greg Smith 和 Ahmed Sidky

image004.jpg

通过示例进行规范
Gojko Adzic

image005.jpg

企业搜索实战
Marc Teutelink

 

© . All rights reserved.