重要的注意事項
失敗的測試通常能幫助你發(fā)現(xiàn)自己本地系統(tǒng)設(shè)置的一些問題,這些問題并不是PHP本身的問題(至少對于官方PHP發(fā)行版本 : )).你可以設(shè)置在一個測試運行完后,自動提交測試的結(jié)果到我們的QA系統(tǒng).
請注意..不要把一次失敗的測試作為一個PHP的bug提交,或者在尋求關(guān)于為什么測試會在你的系統(tǒng)失敗的幫助的時候,沒有提供任何 關(guān)于你系統(tǒng)的特殊設(shè)置 的可能有用的信息.
測試的基礎(chǔ)
測試你PHP的構(gòu)建的最簡單方法是: 在成功編譯后,命令行運行 'make test' 命令,這個命令的作用是,用php cli 對所有功能和擴展進(jìn)行測試.
為了執(zhí)行你的測試腳本,在編譯PHP的時候,一定同時要編譯必要的SAPI, 然后你就可以通過輸入 'make test' 指令去執(zhí)行 在PHP源代碼根目錄下的tests目錄里的全部 或者部分 測試腳本了.
用法:
'make test'
一般來說 'make test' 執(zhí)行的是源碼根目錄下的 'run-tests.php' 文件, 因此, 你也能通過下面這樣去執(zhí)行 'make test'指令:
1.設(shè)置環(huán)境變量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執(zhí)行 run-tests.php 這個文件,就一定要設(shè)置 TEST_PHP_EXECUTABLE 環(huán)境變量的值,從而清楚地指明要被測試的php(也就是要用來去運行測試腳本的php)
如果你用 'make test'指令去運行測試, PHP-cli 和CGI 會自動的被設(shè)置.'make test' 會用 php-cli 執(zhí)行 run-tests.php 文件,而有一些測試腳本,例如:session測試, 是必須在CGI SAPI環(huán)境中執(zhí)行的,因此,你必須在編譯PHP的時候, 把CGI SAPI 也編譯進(jìn)去.
注意:
執(zhí)行 'run-tests.php' 文件的PHP 和 最終執(zhí)行測試腳本的 PHP 獲取不是同一個, 如果你使用了不同路徑的PHP,獲取會出錯.
[ 使用哪個php.ini ]
一旦PHP安裝完畢,'make test'將會使用同一個php.ini文件, 測試和php.ini文件是獨立的,因此,如果你發(fā)現(xiàn)一個測試被php.ini文件的設(shè)置所影響,請報告它,以便我們解決.
[ 執(zhí)行哪個測試腳本 ]
不加任何參數(shù)的去執(zhí)行 "run-tests.php" ("make test") 會運行所有的測試腳本(到源文件根目錄或者子目錄下的tests文件夾下找). 如果在文件夾下游擴展名為 phpt 的文件,'run-tests.php'在測試腳本中,搜尋sections,同時根據(jù) SKIP SECTION 的內(nèi)容判斷是否執(zhí)行這個測試.如果這個測試判斷要被執(zhí)行,文件的 FILE section的內(nèi)容將會被提取到 一個和當(dāng)前測試腳本同名的.php文件中,同時執(zhí)行這個文件.
如果加上參數(shù), 或者設(shè)置相關(guān)的環(huán)境變量,尋找范圍將會拓寬,任何以.phpt為擴展名的文件將會被認(rèn)為是一個測試腳本
測試能夠像下面一樣選擇性的執(zhí)行測試腳本
例子:
./sapi/cli/php run-tests.php ext/mbstring/*
./sapi/cli/php run-tests.php ext/mbstring/020.phpt
[ 測試結(jié)果 ]
測試結(jié)果將打印到標(biāo)準(zhǔn)輸出.如果有失敗的測試,'run-tests.php'腳本會將結(jié)果保存 測試結(jié)果,期望結(jié)果 和執(zhí)行的代碼 到測試腳本目錄下.舉個例子,如果 ext/myext/tests/myext.phpt 這個測試腳本測試出錯, 下面幾個文件將會被創(chuàng)建:
ext/myext/tests/myext.php - 實際執(zhí)行的文件(代碼)
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,或者是因為測試者的系統(tǒng)環(huán)境應(yīng)用了一些沒有考慮的到設(shè)置,又或者PHP本身存在bug.如果這是一個知名的bug,我們會盡量在測試名或者文件名中提供bug number,你能夠訪問 http://bugs.php.net/12345 (其中 12345是bug number) 得到相關(guān)bug的信息.
為了簡明和自動化處理,bug number 一般用一個哈希標(biāo)志 # 開頭 原文 => (bug numbers are prefixed by a hash
sign '#' in test names and/or test cases are named bug12345.phpt.)
注意
測試失敗所生成的文件能夠通過環(huán)境變量 TEST_PHP_LOG_FORMAT 的設(shè)置去改變.對于你想要生成的文件,你可以用上面括號中的字母去設(shè)置 ((L)(E)這些),默認(rèn)的設(shè)置是 LEOD. 而 .php文件總是會被生成的.
注意
你也可以通過設(shè)置 TEST_PHP_DETAILED 變量,去允許/禁止生成詳細(xì)的測試信息.
[ 自動化測試 ]
如果你喜歡追求速度,新技術(shù)和質(zhì)量保證, 把環(huán)境變量 NO_INTERACTION 設(shè)置為1,這樣將不會提示讓測試者輸入任何內(nèi)容.
一般的,'make test' 退出時,不管獨立的測試的結(jié)果是成功還是失敗,都會返回 0,當(dāng)把環(huán)境變量 REPORT_EXIT_STATUS 設(shè)置為1, 當(dāng)其中一個獨立的測試失敗時, 'make test'將會返回一個非零的數(shù)字 ($?).
cron定時執(zhí)行去自動化測試的腳本:
========== 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 =============
注意
當(dāng)REPORT_EXIT_STATUS 環(huán)境變量設(shè)置了的時候, run-tests.php 的返回值將會是1. 而 "make test" 或許會返回大于1的值. 目前, gmake 3.79.1 將會返回 2, 因此,在判斷測試是否成功時,我們建議 用大于0 (-gt 0), 而不是一個特定的值,比如 1.
[ 創(chuàng)建一個新的測試腳本 ]
如果你能夠熟練寫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);
?>