首页 > 设计 > WEB开发 > 正文

24.6.测试用例之间共享测试数据

2023-06-18 13:11:46
字体:
来源:转载
供稿:网友
24.6.1. 问题
我想在多个测试用例之间共享数据,包括简单的或复杂的测试数据实例。
24.6.2. 解决办法
创建能生成所需测试数据实例的工厂类。
24.6.3. 讨论
一般的单元测试都有多个测试用例,彼此之间需共享相同或类似的测试数据。这些数据可能很简单,比如是一个表示地址的object,也可能会很复杂,比如是以特定方式建立的相关实体的命令。不是通过剪贴和粘帖代码或从外部载入资源来为每个TestCase创建和初始化对象,而是通过工厂来集中创建。这种集中处理数据的类型方式我们称之为ObjectMother 设计模式。

简单为例,ObjectMother是个简单的工具类,只提供一个静态方法用于创建需要的类型对象。

该方法通常有两种形式:一种是需要传递一个参数值用于设置每个属性,该方法只装配对象。

第二种需要很少或不需要参数,该方法为每个字段提供实际的智能的默认值。如需要其他的对象类型,还可以使用较低级别的创建方法来生成更复杂的对象。

下面的例子是一个简单的ObjectMother实现:
+展开
-ActionScript
package
{
public class ObjectMother
{
public static const SHIPPING_ZIP_CODE:String = "0123";
public static function createAddress(line:String,
city:String, state:String, zip:String):Address
{
var address:Address = new Address();
address.line = line;
address.city = city;
address.state = state;
address.zip = zip;
return address;
}
public static function createAddressShipping():Address
{
return createAddress("123 A Street""Boston""MA",
SHIPPING_ZIP_CODE);
}
public static function createAddressBilling():Address
{
return createAddress("321 B Street""Cambridge""MA",
"02138");
}
public static function createOrder(lineItems:Array =
null):Order
{
var order:Order = new Order();
order.shippingAddress = createAddressShipping();
order.billingAddress = createAddressBilling();
for each (var lineItem:LineItem in lineItems)
{
addLineItemToOrder(order, lineItem);
}r
return order;
}
public static function addLineItemToOrder(order:Order,
lineItem:LineItem):void
{
order.addLineItem(lineItem);
}
}
}

从简单的Address对象开始,定义了标准的参数化创建方法createAddress。两个辅助类函数createAddressShipping和createAddressBilling,为TestCase方法提供快速方式访问更充实的Address实例。辅助类函数建立在通用的createAddress函数值上。分层的创建策略可方便的创建出更复杂类型的对象,如这里的createOrder例子。

因为每次调用一个方法都会生成新的对象实例,所以由一个TestCase的修改不会影响到另一个TestCase。同一时刻,测试数据都被集中化处理,在ObjectMother中修改数据以支持新的测试可能会破坏现有的测试。相对于能轻松访问到测试数据等优点这只是一点小问题。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表