分享

张杰, PHP, Impossible is nothing: PHP单元测试工具PHPUnit初体验(原创)

 Ralf_Jones 2006-06-27
PHP单元测试工具PHPUnit初体验

z33 <newbdez33 at gmail.com>
2005.10.27

今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了PHP的单元测试工具PHPUnit,所以写个文档备查。

看了PHPUnit的文档之后基本有了一些了解,
http://pear./manual/en/packages.php.phpunit.intro.php

工作流程如下:
1.设计你的class/API
2.创建测试程序集
3.实现class/API
4.运行测试
5.修正测试失败或错误,回到第4步。

我们来举个例子:
下面是你要测试的class,其中formatn函数一个取任意数字的5位有效数字的函数。
代码:
----------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
代码:
----------testcase.php-----------
<?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);
   }

}


最后还需要一个运行测试的程序
代码:
----------runtest.php-----------
<?php
require_once ‘testcase.php‘;
require_once ‘PHPUnit.php‘;

$suite = new PHPUnit_TestSuite("foTest");
$result = PHPUnit::run($suite);

echo $result->toString();
?>



现在就可以通过命令行运行这个testcase
php runtest.php

得到结果如下:
代码:
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,如下:
代码:

   function testFormatn6() {
      $result = $this->abc->formatn("1343");
      $expected = "1343";
      $this->assertEquals($expected, $result);
   }


如果失败得到对应的结果会直观一些(可以显示错误的结果):
代码:

TestCase foTest->testFormatn8() failed: expected 1343 , actual 134.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多