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上