如何对数据进行测试?(2)

发表于:2013-01-10来源:生生不息作者:circleoflife点击数: 标签:数据测试
Setup的StartService步骤,如果被测试对象是一个影子进程,而你测试的是这个影子进程的配置项,那么每次测试的时候,你就都需要重新启动这个进程,以确

  Setup的StartService步骤,如果被测试对象是一个影子进程,而你测试的是这个影子进程的配置项,那么每次测试的时候,你就都需要重新启动这个进程,以确最新的配置项被加载。

  Run的sendInput阶段,有些被测试程序是被动接收数据的,比如一个http服务,或者一个监控某一个目录的影子进程,那么这样的被测对象,要启动它,只需要将数据发送给他就好了。所以这个步骤就是用于发送测试数据。

  Run的execute阶段,大部分被测试对象是属于需要主动运行的,比如hadoop或者hive脚本,需要执行一个脚本,来启动被测试对象,那么这种启动的代码,放在这个步骤中。

  Run的getResult阶段,

  Teardown的stopService阶段,用来关闭被测试对象的影子服务。

  Teardown的stopRefService阶段,用来关闭之前启动的被测试对象依赖的服务。

  以上的阶段和步骤的划分,只是对整个自动化测试过程的一个划分,针对不同的被测试对象,步骤执行也是不同的,并不是每一个步骤的需要有代码,而是选择最合适的步骤就好。

  按照这个思路,我们改造之前的代码:

  

  class underTest

  {

  function go()

  {

  $this->setup();

  $this->run();

  $this->tearDown();

  }

  function setup()

  {

  $this->cleanEvironment();

  $this->generateConfig();

  $this->generateData();

  $this->startRefServices();

  $this->startService();

  }

  function run()

  {

  $this->sendInput();

  $this->execute();

  $this->getResult();

  }

  function teardown()

  {

  $this->stopService();

  $this->stopRefServices();

  }

  function cleanEvironment()

  {

  exec('rm -rf /table_path/staff');

  }

  function generateConfig(){}

  function gnerateData()

  {

  $input = get_user_input();

  file_put_contents('/tmp/staff.table', $input); //将输入的数据写入到文件

  }

  function startRefServices(){}

  function startService(){}

  function sendInput()

  {

  exec('hadoop fs -mkdir /table_path/staff/'); //在hadoop上建立目标文件的目录路径

  exec('hive -e "create external table stuff(name string, age bigint, salary bigint) partitioned by (dp string) location \'/table_path/staff/dp=etao\';"'); //建立hive的建表语句

  exec('hadoop fs -put /tmp/staff.table/table_path/staff/dp=etao/part-000'); //将我们的数据文件放到hdfs上

  exec('hive -e "alter table staff add if not exists partition ( dp=etao ) location \’/table_path/staff/dp=etao"');//调用alter table为我们的表增加一个分区,地址是刚刚上传的文件(hive的专有特性)

  }

  function execute()

  {

  exec('underTestShell.sh'); //执行被测试脚本

  }

  function getResult()

  {

  exec('hadoop fs -cat /tmp/result.table/table_path/result/dp=etao/part-000 > /tmp/result.tmp'); //将结果表的结果下载下来

  $result = file_get_contents('/tmp/result.tmp'); //结果表读取到内存中

  }

  function stopService(){}

  function stopRevServices(){}

  }

  ?>

  你也许会说,这不就是将我之前写好的代码拆成几个步骤吗?是的,但是这么做好处多多:

  1. 规范。划分成这样的阶段和步骤之后,测试人员就可以找到自己应该在哪个阶段写入代码,维护其他测试人员代码的时候,也就可以找到相应的阶段了。

  2. 可分步骤运行。如果测试应用定义了启动相关服务,而测试用例运行的时候,只需要启动一次服务,启动之后的其他测试用例运行就无需启动,这种情况下,我们可以在test dirver中,选择性的运行这一步骤。其他步骤也是一样的。

  3. 更加大局的看,这么做将来可以将每个步骤需要做的工作,抽象成模块,供给其他测试应用使用。

  如果你有心,你会发现,可以用面向对象的思想将这些步骤的定义提取到一个父类去,然后以后只需要继承就好。

  在接下来的一章,我们将会讲对于数据的抽象和封装。

  

  //下面一段是期望操作

  $input = "zhangsan|28|8000\n";//准备输入数据,第一行

  $input.= "lisi|30|10000\n"; //准备输入数据,第二行

  $input.= "wangwu|40|20000\n"; //准备输入数据,第三行

  //下面一段是无关操作

  file_put_contents('/tmp/staff.table', $input); //将输入的数据写入到文件

  exec('hadoop fs -mkdir /table_path/staff/'); //在hadoop上建立目标文件的目录路径

  exec('hive -e "create external table stuff(name string, age bigint, salary bigint) partitioned by (dp string) location \'/table_path/staff/dp=etao\';"'); //建立hive的建表语句

  exec('hadoop fs -put /tmp/staff.table/table_path/staff/dp=etao/part-000'); //将我们的数据文件放到hdfs上

原文转自:http://www.ltesting.net