重要的注意事项
失败的测试通常能帮助你发现自己本地系统设置的一些问题,这些问题并不是PHP本身的问题(至少对于官方PHP发行版本 : )).你可以设置在一个测试运行完后,自动提交测试的结果到我们的QA系统.
请注意..不要把一次失败的测试作为一个PHP的bug提交,或者在寻求关于为什么测试会在你的系统失败的帮助的时候,没有提供任何 关于你系统的特殊设置 的可能有用的信息.
测试的基础
测试你PHP的构建的最简单方法是: 在成功编译后,命令行运行 'make test' 命令,这个命令的作用是,用php cli 对所有功能和扩展进行测试.
为了执行你的测试脚本,在编译PHP的时候,一定同时要编译必要的SAPI, 然后你就可以通过输入 'make test' 指令去执行 在PHP源代码根目录下的tests目录里的全部 或者部分 测试脚本了.
用法:
'make test'
一般来说 'make test' 执行的是源码根目录下的 'run-tests.php' 文件, 因此, 你也能通过下面这样去执行 'make test'指令:
1.设置环境变量TEST_PHP_EXECUTABLE 为你的php-cli路径 => export =sapi/cli/php
2.sapi/cli/php [-c /path/to/php.ini] run-tests.php [ext/foo/tests/GLOB]
[ 运行 make test 时, 找寻php的路径]
如果你像上面一样, 在命令行直接用php-cli执行 run-tests.php 这个文件,就一定要设置 TEST_PHP_EXECUTABLE 环境变量的值,从而清楚地指明要被测试的php(也就是要用来去运行测试脚本的php)
如果你用 'make test'指令去运行测试, PHP-cli 和CGI 会自动的被设置.'make test' 会用 php-cli 执行 run-tests.php 文件,而有一些测试脚本,例如:session测试, 是必须在CGI SAPI环境中执行的,因此,你必须在编译PHP的时候, 把CGI SAPI 也编译进去.
注意:
执行 'run-tests.php' 文件的PHP 和 最终执行测试脚本的 PHP 获取不是同一个, 如果你使用了不同路径的PHP,获取会出错.
[ 使用哪个php.ini ]
一旦PHP安装完毕,'make test'将会使用同一个php.ini文件, 测试和php.ini文件是独立的,因此,如果你发现一个测试被php.ini文件的设置所影响,请报告它,以便我们解决.
[ 执行哪个测试脚本 ]
不加任何参数的去执行 "run-tests.php" ("make test") 会运行所有的测试脚本(到源文件根目录或者子目录下的tests文件夹下找). 如果在文件夹下游扩展名为 phpt 的文件,'run-tests.php'在测试脚本中,搜寻sections,同时根据 SKIP SECTION 的内容判断是否执行这个测试.如果这个测试判断要被执行,文件的 FILE section的内容将会被提取到 一个和当前测试脚本同名的.php文件中,同时执行这个文件.
如果加上参数, 或者设置相关的环境变量,寻找范围将会拓宽,任何以.phpt为扩展名的文件将会被认为是一个测试脚本
测试能够像下面一样选择性的执行测试脚本
例子:
./sapi/cli/php run-tests.php ext/mbstring/*
./sapi/cli/php run-tests.php ext/mbstring/020.phpt
[ 测试结果 ]
测试结果将打印到标准输出.如果有失败的测试,'run-tests.php'脚本会将结果保存 测试结果,期望结果 和执行的代码 到测试脚本目录下.举个例子,如果 ext/myext/tests/myext.phpt 这个测试脚本测试出错, 下面几个文件将会被创建:
ext/myext/tests/myext.php - 实际执行的文件(代码)
ext/myext/tests/myext.log - log of test execution (L)
ext/myext/tests/myext.exp - expected output (E)
ext/myext/tests/myext.out - output from test script (O)
ext/myext/tests/myext.diff - diff of .out and .exp (D)
失败的测试一般都是因为bug,或者是测试本身存在bug,或者是因为测试者的系统环境应用了一些没有考虑的到设置,又或者PHP本身存在bug.如果这是一个知名的bug,我们会尽量在测试名或者文件名中提供bug number,你能够访问 http://bugs.php.net/12345 (其中 12345是bug number) 得到相关bug的信息.
为了简明和自动化处理,bug number 一般用一个哈希标志 # 开头 原文 => (bug numbers are prefixed by a hash
sign '#' in test names and/or test cases are named bug12345.phpt.)
注意
测试失败所生成的文件能够通过环境变量 TEST_PHP_LOG_FORMAT 的设置去改变.对于你想要生成的文件,你可以用上面括号中的字母去设置 ((L)(E)这些),默认的设置是 LEOD. 而 .php文件总是会被生成的.
注意
你也可以通过设置 TEST_PHP_DETAILED 变量,去允许/禁止生成详细的测试信息.
[ 自动化测试 ]
如果你喜欢追求速度,新技术和质量保证, 把环境变量 NO_INTERACTION 设置为1,这样将不会提示让测试者输入任何内容.
一般的,'make test' 退出时,不管独立的测试的结果是成功还是失败,都会返回 0,当把环境变量 REPORT_EXIT_STATUS 设置为1, 当其中一个独立的测试失败时, 'make test'将会返回一个非零的数字 ($?).
cron定时执行去自动化测试的脚本:
========== qa-test.sh =============
#!/bin/sh
CO_DIR=$HOME/cvs/php7
MYMAIL=qa-test@domain.com
TMPDIR=/var/tmp
TODAY=`date +"%Y%m%d"`
# Make sure compilation environment is correct
CONFIGURE_OPTS='--disable-all --enable-cli --with-pcre'
export MAKE=gmake
export CC=gcc
# Set test environment
export NO_INTERACTION=1
export REPORT_EXIT_STATUS=1
cd $CO_DIR
cvs update . >>$TMPDIR/phpqatest.$TODAY
./cvsclean ; ./buildconf ; ./configure $CONFIGURE_OPTS ; $MAKE
$MAKE test >>$TMPDIR/phpqatest.$TODAY 2>&1
if test $? -gt 0
then
cat $TMPDIR/phpqatest.$TODAY | mail -s"PHP-QA Test Failed for $TODAY" $MYMAIL
fi
========== end of qa-test.sh =============
注意
当REPORT_EXIT_STATUS 环境变量设置了的时候, run-tests.php 的返回值将会是1. 而 "make test" 或许会返回大于1的值. 目前, gmake 3.79.1 将会返回 2, 因此,在判断测试是否成功时,我们建议 用大于0 (-gt 0), 而不是一个特定的值,比如 1.
[ 创建一个新的测试脚本 ]
如果你能够熟练写PHP,那么写一个测试脚本将是很容易的事情.同时也可以参考 : http://qa.php.net/write-test.php
[ 如何帮助我们 ]
如果你找到了一个PHP的bug,你可以把bug报告和测试脚本提交给我们.你不需要写一个完整的脚本,只需要提供给我们一个按下面格式写成的测试脚本就可以了.
在提交前,请测试这个脚本,同时一定要确定你的 ACTUAL OUTPUT 部分 和 EXPECTED OUTPUT 部分是正确的.
<?php
/*
Bug #12345
substr() bug. Do not return expected string.
ACTUAL OUTPUT
XYXA
EXPECTED OUTPUT
ABCD
*/
$str = "XYZABCD";
echo substr($str,3,7);
?>