php测试工具:phpt
说起php测试,通常会想起PHPUnit,而phpt却很少有人提及。其实在php源码中绝大多数测试均是由phpt完成。
什么是phpt?
phpt是一个小测试脚本,php内核组和质量保证团队用其做php功能性测试。phpt可以保障新版本php不会出现功能缺失、和一些已知bug。编写phpt测试脚本有助于使php自身更加稳定。
编写phpt需要哪些技能?
很简单,了解php语言即可。当然,还需要一个文本编辑器。
phpt可以做哪些测试?
函数测试、基本语法测试、扩张测试等。通常可以到目录php-src/trunk/ext/standard/tests/找到很多新手上路的例子。
一个简单的示例:ext/standard/tests/strings/strtr.phpt
1 2 3 4 5 6 7 8 9 10 | --TEST-- strtr() function - basic test for strstr() --FILE-- <?php /* Do not change this test it is a README.TESTING example. */ $trans = array("hello"=>"hi", "hi"=>"hello", "a"=>"A", "world"=>"planet"); var_dump(strtr("# hi all, I said hello world! #", $trans)); ?> --EXPECT-- string(32) "# hello All, I sAid hi planet! #" |
一个phpt脚本通常至少由三部分组成:TEST, FILE, EXPECT。
运行之
1 2 3 4 5 6 7 8 | # # run-tests.php依赖环境变量TEST_PHP_EXECUTABLE,先手动导入之 # export TEST_PHP_EXECUTABLE=/usr/bin/php cd tests cp /usr/local/lib/php/build/run-tests.php ./ php run-tests.php strtr.phpt |
结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # php run-tests.php strtr.phpt ===================================================================== PHP : /usr/bin/php PHP_SAPI : cli PHP_VERSION : 5.4.0 ZEND_VERSION: 2.4.0 PHP_OS : Darwin - Darwin mac 11.0.0 Darwin Kernel Version 11.0.0: Mon Jun 13 11:33:28 PDT 2011; root:xnu-1699.22.70~3/RELEASE_X86_64 x86_64 INI actual : /usr/local/lib/php.ini More .INIs : CWD : /Volumes/d2/dev/dangdang/reco_server/src/tests Extra dirs : VALGRIND : Not used ===================================================================== Running selected tests. PASS strtr() function - basic test for strstr() [strtr.phpt] ===================================================================== Number of tests : 1 1 Tests skipped : 0 ( 0.0%) -------- Tests warned : 0 ( 0.0%) ( 0.0%) Tests failed : 0 ( 0.0%) ( 0.0%) Expected fail : 0 ( 0.0%) ( 0.0%) Tests passed : 1 (100.0%) (100.0%) --------------------------------------------------------------------- Time taken : 0 seconds ===================================================================== |
嗯哼,测试通过~
很显然,EXPECT标签是无法满足变化的需求的,于是有了EXPECTF
1 2 3 4 5 6 7 8 9 10 11 12 13 | /ext/standard/tests/strings/str_shuffle.phpt --TEST-- Testing str_shuffle. --FILE-- <?php /* Do not change this test it is a README.TESTING example. */ $s = '123'; var_dump(str_shuffle($s)); var_dump($s); ?> --EXPECTF-- string(3) "%s" string(3) "123" |
常见的几个:%s->字符串,%i->INT, %d->numbers, %c->char, %x等。。。和printf的语法是接近的,很容易上手。更多格式。
还有EXPECTREGEX,更强大一些,支持正则表达。
/ext/standard/tests/strings/strings001.phpt
1 2 3 4 5 6 7 8 9 10 11 12 | --TEST-- Test whether strstr() and strrchr() are binary safe. --FILE-- <?php /* Do not change this test it is a README.TESTING example. */ $s = "alabala nica".chr(0)."turska panica"; var_dump(strstr($s, "nic")); var_dump(strrchr($s," nic")); ?> --EXPECTREGEX-- string\(18\) \"nica\x00turska panica\" string\(19\) \" nica\x00turska panica\" |
另外一个很重要的标签:SKIPIF。通常用于监测测试环境,不符合则跳出中断之。
/ext/exif/tests/exif005.phpt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | --TEST-- Check for exif_read_data, unusual IFD start --SKIPIF-- <?php if (!extension_loaded('exif')) print 'skip exif extension not available'; ?> --FILE-- <?php /* Do not change this test it is a README.TESTING example. * test5.jpg is a 1*1 image that contains an Exif section with ifd = 00000009h */ $image = exif_read_data('./ext/exif/tests/test5.jpg','',true,false); var_dump($image['IFD0']); ?> --EXPECT-- array(2) { ["ImageDescription"]=> string(11) "Ifd00000009" ["DateTime"]=> string(19) "2002:10:18 20:06:00" } |
有时候,测试会留下一些垃圾,CLEAN标签会帮上忙。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | --TEST-- Will fail to clean up --FILE-- <?php $temp_filename = "fred.tmp"; $fp = fopen($temp_filename, "w"); fwrite($fp, "Hello Boys!"); fclose($fp); ?> --CLEAN-- <?php unlink($temp_filename); ?> --EXPECT-- |
有了这些基本语法,可以应付80%的测试了,更复杂一些的可以参考官方链接:http://qa.php.net/write-test.php。


