技术开发 频道

浅析 PHP 官方自动化测试方法

  PHP 自动化测试框架的原理和实现

  在清单 3中的运行示例中,实际的执行语句是 “ $HOME/php-5.2.8/sapi/cli/php run-tests.php $HOME/php-5.2.8/sapi/cli/tests/001.phpt ” 。其中,“ 001.phpt ” 是测试脚本;“ run-tests.php ” 为 PHP 测试的驱动脚本,是官方脚本;而 “ $HOME/php-5.2.8/sapi/cli/php ” 是运行驱动脚本的 PHP 可执行对象。这里需要指出的一点是,环境变量 TEST_PHP_EXECUTABLE 中设置的 PHP 可执行对象和这里运行测试脚本中的 “ $HOME/php-5.2.8/sapi/cli/php ” 虽然指向的是同一个可执行对象,但其意义是不一样的。环境变量 TEST_PHP_EXECUTABLE 中设置的 PHP 是被测试对象,而运行测试中使用的 “ $HOME/php-5.2.8/sapi/cli/php ” 只是为了用来驱动测试脚本运行。

  在图 1 中可以具体的看出 PHP 测试过程中两个 PHP 可执行对象及两个 PHP 脚本的关系。在测试的过程中,首先是由 “ $HOME/php-5.2.8/sapi/cli/php ” 去运行脚本 “ run-tests.php ” (第 1 步)。 在 “ run-tests.php ” 脚本中,将解析环境变量的值 “ TEST_PHP_EXECUTABLE =$HOME/php-5.2.8/sapi/cli/php ” (第 2 步)。这里 PHP 可执行对象是被测试的 PHP 。“ run-tests.php ” 脚本中还将把测试脚本 “ 001.phpt ” 中的 FILE 段解析为 PHP 脚本 “ 001.php ” (第 3 步), 用 “ TEST_PHP_EXECUTABLE ” 设置的那个 PHP 可执行对象去执行 “ 001.php ” (第 4 步)并得到实际输出结果,在比对实际输出结果和 EXPECT 段的期待结果后,输出测试结果(第 5 步)。以上运行过程可以从对 “ run-tests.php ” 脚本的分析中得出。

  图 1. PHP 测试运行关系图  

  通过以上实例分析可以看出,PHP 官方测试的自动化主要依赖于 “ run-tests.php ” 脚本和测试用例脚本 PHPT 。而 “ run-tests.php ” 脚本正是 PHP 测试自动化框架的搭建者。从代码清单 5 中,可以略微看出 PHP 自动化测试框架的主要工作。

  清单 5. PHP 自动化测试代码片段

$test_cnt = count($test_files);

    
if ($test_cnt) {
         putenv(
'NO_INTERACTION=1');
         verify_config();
         write_information($html_output);
         usort($test_files,
"test_sort");
         $start_time
= time();

        
if (!$html_output) {
             echo
"Running selected tests.\n";
         }
else {
             show_start($start_time);
         }

         $test_idx
= 0;
         run_all_tests($test_files, $environment);
         $end_time
= time();

        
if ($html_output) {
             show_end($end_time);
         }

        
if ($failed_tests_file) {
             fclose($failed_tests_file);
         }

        
if (count($test_files) || count($test_results)) {
             compute_summary();
            
if ($html_output) {
             fwrite($html_file,
"<hr/>\n" . get_summary(false, true));
             }
             echo
"=================================================";
             echo get_summary(
false, false);
         }

        
if ($html_output) {
             fclose($html_file);
         }

        
if ($output_file != '' && $just_save_results) {
             save_or_mail_results();
         }

        
if (getenv('REPORT_EXIT_STATUS') == 1 and preg_match('/FAILED(?: |$)/',   \
                    implode(' ', $test_results))) {
             exit(1);
         }

  在测试前,这个自动化测试的框架按照用户指定的有效测试文件数目来决定具体将有多少个测试用例,并写入 test_cnt 变量中以备计数使用。函数 verify_config() 分别用来验证和准备各种环境变量的设置及 ini 设置。函数 write_information() 将输出本次测试环境的各种信息,包括被测试 PHP 的版本号,使用的扩展( Extention ),ZEND 版本,INI 设置,测试所在的系统版本信息,以及测试时间记录。

  测试用例的运行发生在函数 run_all_tests() 中调用的函数 run_test() 中。 run_test() 将具体解析测试脚本中各个段落的含义,清除所以上次测试的记录与设置将干净的测试环境准备完毕,并把各种中间文件和日志文件准备好,然后用环境变量 TEST_PHP_EXECUTABLE 指定的 PHP 可执行对象运行实际的测试语句。最后将运行后的结果和测试脚本中期待值进行比对,如果比对失败,则将结果信息一一记录到用户设置的日志文件中。

  在所有的测试都运行结束后,变量 end_time 将记录测试的结束时间,并用函数 compute_summary() 计算成功的、失败的、跳过的等各种情况的测试数目,并将结果输出。

  由此可以总结出,这个自动化测试的框架主要包括如下几个部分:

  1.测试前的准备:包括环境准备以及测试脚本的解析等,如对上次测试遗留下的环境的清理,本次测试所必须的环境变量的读取与设置,对测试参数的解析,测试脚本名的解析,各种输出文件的准备等等。

  2.测试中的脚本运行:解析测试脚本中的各个段落,组织出测试语句,执行测试语句,得到实际运行结果。

  3.测试后的结果比对及输出:测试后完成实际输出结果和期待值的比对,包括各种格式化的比对和正则表达式方式的比对。按要求将结果存写入指定的文件中,并输出测试结果的总结报告。

0
相关文章