51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1945|回复: 1
打印 上一主题 下一主题

[原创] 浅析PHP官方自动化测试方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-4-1 16:19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文将从一个测试人员的角度对 PHP 官方的自动化测试方法,自动化测试框架结构,以及具体的实现进行分析和研究。通过实际的例子,向读者展示 PHP 是如何实现有效的自动化测试以保证其代码高质量的。读者通过阅读本文,可以学习 PHP 官方自动化测试方法和实现,并将这种自动化测试方法应用到自己的开发过程中,提高代码功能质量。  PHP 官方自动化测试方法简述
  以下介绍以 PHP 最新官方版本 5.2.8 的源码在 LINUX 系统平台上的分析为例展开。首先来看一下 PHP 的自动化测试脚本 PHPT 脚本。
  自动化测试脚本 PHPT 示例
  PHP 的测试脚本是以“ .phpt ”为后缀,包含 TEST,FILE,EXPECT 等多个段落的文件,简称 PHPT 。在各个段落中,TEST,FILE,EXPECT 是基本的段落,每个测试脚本都必须至少包括这三个段落。其中,TEST 段可以用来填写测试用例的名字; FILE 段是一个 PHP 脚本实现的测试用例; EXPECT 段则是测试用例的期待值。测试用例的运行中,PHP 将用被测试的 PHP 可执行对象去运行 FILE 段中的测试用例,用实际的结果去比对测试用例中 EXPECT 段所列的期待值;如果实际结果和期待值一致,则测试通过;如果不一致,则测试失败。
  表 1 列出的是常用的段落名和其相应的填充内容说明。
表 1. PHP 测试脚本中的段落说明
段落名填充内容备注
TEST测试用例名称必填段落
ARGSFILE 段的输入参数选填段落
SKIPIF跳过这个测试的条件选填段落
POST传入测试脚本的 POST 变量选填段落。如果使用 POST 段,建议配合使用 SKIPIF 段,如:
--SKIPIF--
<?php if (php_sapi_name()=='cli') echo 'skip'; ?>
GET传入测试脚本的 GET 变量选填段落。如果使用 POST 段,建议配合使用 SKIPIF 段,如:
--SKIPIF--
<?php if (php_sapi_name()=='cli') echo 'skip'; ?>
INI应用于测试脚本的 ini 设置选填段落。例如 foo=bar 。其值可通过函数 ini_get(string name_entry) 获得。
FILE测试脚本语句必填段落。应用 PHP 语言书写的脚本语句。其执行的结果将与 EXPECT* 段的期待值做对比。
EXPECT测试脚本的期待值必填段落
EXPECTF测试脚本的期待值,可用函数 sscanf() 中的格式表达期待值EXPECT 段的变体
EXPECTREGEX测试脚本的期待值,可用正则式表达期待值EXPECT 段的变体

  以官方包里自带的测试脚本 “ 001.phpt ” 为例(见清单 1),从 TEST 段的内容看来这是一个对 PHP 版本进行验证的测试用例。 SKIPIF 段的内容写在了 “ skipip.inc ” 文件里。在 FILE 段里,测试用例将环境变量 TEST_PHP_EXECUTABLE 里设置的那个 PHP 的版本打印出来,这个结果将和 EXPECTF 中的字串进行格式匹对。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2009-4-1 16:22:17 | 只看该作者
 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);
   }
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-14 21:03 , Processed in 0.081333 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表