软件测试中通用测试数据生成方法(2)

发表于:2014-09-01来源:uml.org.cn作者:不详点击数: 标签:软件测试
清单二:生成的数据 int_10 char_A abc 100 int_11 char_B 123 102 int_12 char_C xyz 104 int_13 char_D 100 106 int_14 char_E 101 108 int_15 char_F 102 110 int_16 char_G 103 112 int_17 char_H 104

  清单二:生成的数据

  int_10 char_A abc 100

  int_11 char_B 123 102

  int_12 char_C xyz 104

  int_13 char_D 100 106

  int_14 char_E 101 108

  int_15 char_F 102 110

  int_16 char_G 103 112

  int_17 char_H 104 114

  int_18 char_I 105 116

  int_19 char_J 106 118

  代码实现:

  第一步:解析 ini 文件

  error_reporting(0);

  $iniFile = $argv[1]; // 第一个参数为配置文件。

  $dataCount = $argv[2]; // 第二个参数为要生成的记录数。

  $fields = parse_ini_file($iniFile, true); // 将 ini 配置文件转换为一个数组。

  第二步:生成每一个字段的取值列表

  foreach($fields as $fieldName => $field)

  {

  $list = array();

  $equalPos = strpos($field['datatype'], '='); // 取得等号的为止。 range=[]

  $range = substr($field['datatype'], $equalPos + 2, -1); // 取得 range 的列表(去掉了 [])

  $items = explode(',', $range); // 得到所有的 item 元素。

  /* 循环处理每一个 item,如果是一个区间,则调用 range 函数。 */

  foreach($items as $item)

  {

  if(strpos($item, '-'))

  {

  list($min, $max) = explode('-', $item);

  $list = array_merge($list, range($min, $max)); // 追加到 field 的 list 列表中。

  }

  else

  {

  $list[] = $item;

  }

  }

  $field['list'] = $list; // 将最终的 list 列表赋值给 field 。

  $field['pointer'] = 0; // 初始化这个列表的指针。

  $fields[$fieldName] = $field; // 写回整个 fields 数组。

  }

  第三步:循环输出数据

  /* 循环输出数据。 */

  for($i = 0; $i < $dataCount; $i ++)

  {

  foreach($fields as $fieldName => $field)

  {

  $pointer = $field['pointer'];

  /* 如果指针已经到到了列表的尾部,重新指向列表开始。 */

  if($pointer == count($field['list'])) $pointer = 0;

  echo $field['prefix']; // 输出前缀。

  echo $field['list'][$pointer]; // 输出当前指针所对应的列表中的取值。

  echo $field['postfix']; // 输出后缀。

  $pointer ++;

  $fields[$fieldName]['pointer'] = $pointer;

  }

  echo "\n";

  }

  这样我们用了不到 50 行的代码就完成了一个基本的数据生成工具。这其实已经可以满足基本的数据生成任务了。但是还需要进一步进行完善。

  需要进一步完善的地方

  第一:数据的扩展性

  虽然 list 类型已经足够灵活,但有时候还无法满足需要。比如一个比较复杂的字段,由若干小字段组成。这时可以将这个复合字段再通过一个 ini 文件来定义,这样就有了无限可能。

  比如,我们在 example.ini 文件中增加一个日期的字段,格式为 yyyy 年 mm 月 dd 日的格式

  清单三:example.ini 中新增一个字段

  [field5]

  prefix=""

  datatype="custom" " 定义这个字段的数据类型为 custom

  datacfg="custom.ini" " 定义这个字段的配置文件为 custom.ini

  postfix=""

  清单四:custom.ini

  [field5.1]

  prefix=""

  datatype="list, range=[1980-1999]"

  postfix=" 年 "

  [field5.2]

  prefix=""

  datatype="list, range=[1-12]"

  postfix=" 月 "

  [field5.3]

  prefix=""

  datatype="list, range=[1-31]"

  postfix=" 日 "

  这可以通过 php 中的递归函数来实现这个解析。即当解析到一个字段发现是自定义类型的时候,就读取这个字段所对应的 ini 配置文件,然后再解析它的每一个字段。具体的代码就不给出了,读者朋友们可以尝试实现。

  第二:列表可以更加灵活

  列表 range 参数还可以更加灵活,比如:

  1. 可以指定步长:range=[1-100:2],表示从 1 到 100,步长为 2 递增。

原文转自:http://www.uml.org.cn/Test/201204263.asp