今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了PHP的单元测试工具PHPUnit,所以写个文档备查。
工作流程如下:
1.设计你的class/API
2.创建测试程序集
3.实现class/API
4.运行测试
5.修正测试失败或错误,回到第4步。
我们来举个例子:
下面是你要测试的class,其中formatn函数一个取任意数字的5位有效数字的函数。
CODE:----------format_number.php-----------
class fo {
function fo() {
}
function formatn($num) {
$num = rtrim($num,"0");
$pos = strpos($num,".");
$num =
str_replace(".","",$num);
$count1 = strlen($num);
$num =
ltrim($num,"0");
$count2 =
strlen($num);
$zeroc = $count1 -
$count2;
$num =
substr($num,0,6);
$num =
round($num/10);
//$num =
str_pad($num, 5, "0");
if
($pos !== false) {
$num =
str_pad($num, (strlen($num)+$zeroc),
"0", STR_PAD_LEFT);
$dotl =
substr($num,0,$pos);
$dotr =
substr($num,$pos);
$num =
$dotl.".".$dotr;
}
return $num;
}
}
接着创建TestCase,继承自PHPUnit_TestCase
CODE:----------testcase.php-----------
require_once 'format_number.php';
require_once 'PHPUnit.php';
class foTest extends PHPUnit_TestCase {
//这个成员变量是存放要测试的类引用
var $abc;
//构造函数
function foTest($name)
{
$this->;PHPUnit_TestCase($name);
}
//new一个要测试的类为成员变量abc赋值
function setUp()
{
$this->;abc = new fo;
}
//unset要测试的类
function tearDown()
{
unset($this->;abc);
}
//自定义的testcase
function testFormatn1()
{
//调用要测试的类的方法,结果放到$result变量
$result =
$this->;abc->;formatn("100.234");
//期望结果
$expected =
"100.23";
//判断是否相等,这里使用assertTrue方法来判断布而值是否为true。
$this->;assertTrue($result == $expected);
}
function testFormatn2() {
$result =
$this->;abc->;formatn("0.100234");
$expected = "0.10023";
$this->;assertTrue($result == $expected);
}
function testFormatn3() {
$result =
$this->;abc->;formatn("0.100235");
$expected = "0.10024";
$this->;assertTrue($result == $expected);
}
function testFormatn4() {
$result =
$this->;abc->;formatn("0.000100235");
$expected = "0.00010024";
$this->;assertTrue($result == $expected);
}
function testFormatn5() {
$result =
$this->;abc->;formatn("0.000100232");
$expected = "0.00010023";
$this->;assertTrue($result == $expected);
}
function testFormatn6() {
$result =
$this->;abc->;formatn("1343");
$expected = "1343";
$this->;assertTrue($result == $expected);
}
function testFormatn7() {
$result =
$this->;abc->;formatn("1343.01");
$expected = "1343";
$this->;assertTrue($result == $expected);
}
function testFormatn8() {
$result =
$this->;abc->;formatn("1343.05");
$expected = "1343.1";
$this->;assertTrue($result == $expected);
}
function testFormatn9() {
$result =
$this->;abc->;formatn("0");
$expected = "0";
$this->;assertTrue($result == $expected);
}
function testFormatn10()
{
$result =
$this->;abc->;formatn("105.2342");
$expected = "105.23";
$this->;assertTrue($result == $expected);
}
function testFormatn11()
{
$result =
$this->;abc->;formatn("105.2375");
$expected = "105.24";
$this->;assertTrue($result == $expected);
}
function testFormatn12()
{
$result =
$this->;abc->;formatn("0.000523751");
$expected = "0.00052375";
$this->;assertTrue($result == $expected);
}
function testFormatn13()
{
$result =
$this->;abc->;formatn("0.000523755");
$expected = "0.00052376";
$this->;assertTrue($result == $expected);
}
}
最后还需要一个运行测试的程序
CODE:----------runtest.php-----------
$suite = new
PHPUnit_TestSuite("foTest");
$result =
PHPUnit::run($suite);
echo
$result->;toString();
?>;
现在就可以通过命令行运行这个testcase
php
runtest.php
得到结果如下:
CODE:TestCase foTest->;testFormatn1()
passed
TestCase foTest->;testFormatn2() passed
TestCase
foTest->;testFormatn3() passed
TestCase
foTest->;testFormatn4() passed
TestCase
foTest->;testFormatn5() passed
TestCase
foTest->;testFormatn7() passed
TestCase
foTest->;testFormatn8() passed
TestCase
foTest->;testFormatn9() passed
TestCase
foTest->;testFormatn10() passed
TestCase
foTest->;testFormatn11() passed
TestCase
foTest->;testFormatn12() passed
TestCase
foTest->;testFormatn13() passed
TestCase
foTest->;testFormatn6() failed: expected TRUE, actual
FALSE
其中testFormatn6的测试失败,
我们就可以去检查一下我们的代码在什么地方出问题了。
补充一点
也可以把assertTrue方法换assertEquals,如下:
CODE: function testFormatn6()
{
$result =
$this->;abc->;formatn("1343");
$expected = "1343";
$this->;assertEquals($expected, $result);
}
如果失败得到对应的结果会直观一些(可以显示错误的结果):
CODE:TestCase foTest->;testFormatn8() failed:
expected 1343 , actual 134.