软件测试


网站首页 | 软件测试论坛 | 软件测试培训 | 软件测试博客 | 软件测试杂志 | 软件测试沙龙 | 软件测试下载 | 软件测试顾问
业界新闻 | 软件测试人才 | 软件测试技术 | 软件测试工具 | 行业软件测试 | 软件测试管理 | 软件质量专栏 | 软件开发专栏
当前位置:首页>>软件测试技术>>单元测试>>正文
PHP单元测试工具PHPUnit初体验
文章出处:ChinaUnix 作者: 发布时间:2006-05-16

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

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

工作流程如下:
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-----------
<?php

require_once 'format_number.php';
require_once 'PHPUnit.php';

class foTest extends PHPUnit_TestCase &#123;

        //这个成员变量是存放要测试的类引用
        var $abc;

        //构造函数
        function foTest&#40;$name&#41; &#123;
                $this->;PHPUnit_TestCase&#40;$name&#41;;
        &#125;

        //new一个要测试的类为成员变量abc赋值
        function setUp&#40;&#41; &#123;
                $this->;abc = new fo;
        &#125;

        //unset要测试的类
        function tearDown&#40;&#41; &#123;
                unset&#40;$this->;abc&#41;;
        &#125;

        //自定义的testcase
        function testFormatn1&#40;&#41; &#123;
                //调用要测试的类的方法,结果放到$result变量
                $result = $this->;abc->;formatn&#40;&quot;100.234&quot;&#41;;
                //期望结果
                $expected = &quot;100.23&quot;;
                //判断是否相等,这里使用assertTrue方法来判断布而值是否为true。
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn2&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;0.100234&quot;&#41;;
                $expected = &quot;0.10023&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn3&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;0.100235&quot;&#41;;
                $expected = &quot;0.10024&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn4&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;0.000100235&quot;&#41;;
                $expected = &quot;0.00010024&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn5&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;0.000100232&quot;&#41;;
                $expected = &quot;0.00010023&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn6&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;1343&quot;&#41;;
                $expected = &quot;1343&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn7&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;1343.01&quot;&#41;;
                $expected = &quot;1343&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn8&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;1343.05&quot;&#41;;
                $expected = &quot;1343.1&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn9&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;0&quot;&#41;;
                $expected = &quot;0&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn10&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;105.2342&quot;&#41;;
                $expected = &quot;105.23&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn11&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;105.2375&quot;&#41;;
                $expected = &quot;105.24&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn12&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;0.000523751&quot;&#41;;
                $expected = &quot;0.00052375&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

        function testFormatn13&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;0.000523755&quot;&#41;;
                $expected = &quot;0.00052376&quot;;
                $this->;assertTrue&#40;$result == $expected&#41;;
        &#125;

&#125;
最后还需要一个运行测试的程序

CODE:
----------runtest.php-----------
<?php
require_once 'testcase.php';
require_once 'PHPUnit.php';

$suite = new PHPUnit_TestSuite&#40;&quot;foTest&quot;&#41;;
$result = PHPUnit&#58;&#58;run&#40;$suite&#41;;

echo $result->;toString&#40;&#41;;
?>;
现在就可以通过命令行运行这个testcase
php runtest.php

得到结果如下:

CODE:
TestCase foTest->;testFormatn1&#40;&#41; passed
TestCase foTest->;testFormatn2&#40;&#41; passed
TestCase foTest->;testFormatn3&#40;&#41; passed
TestCase foTest->;testFormatn4&#40;&#41; passed
TestCase foTest->;testFormatn5&#40;&#41; passed
TestCase foTest->;testFormatn7&#40;&#41; passed
TestCase foTest->;testFormatn8&#40;&#41; passed
TestCase foTest->;testFormatn9&#40;&#41; passed
TestCase foTest->;testFormatn10&#40;&#41; passed
TestCase foTest->;testFormatn11&#40;&#41; passed
TestCase foTest->;testFormatn12&#40;&#41; passed
TestCase foTest->;testFormatn13&#40;&#41; passed
TestCase foTest->;testFormatn6&#40;&#41; failed&#58; expected TRUE, actual FALSE
其中testFormatn6的测试失败,
我们就可以去检查一下我们的代码在什么地方出问题了。


补充一点
也可以把assertTrue方法换assertEquals,如下:

CODE:
        function testFormatn6&#40;&#41; &#123;
                $result = $this->;abc->;formatn&#40;&quot;1343&quot;&#41;;
                $expected = &quot;1343&quot;;
                $this->;assertEquals&#40;$expected, $result&#41;;
        &#125;
如果失败得到对应的结果会直观一些(可以显示错误的结果):

CODE:
TestCase foTest->;testFormatn8&#40;&#41; failed&#58; expected 1343 , actual 134.

站内搜索
相关文章
◎JUnit中如何测试异常
◎如何挑选白盒测试工具
◎用cppUnit进行单元测试的步骤
◎JUnit起步
◎nunit使用资料
◎单元测试------理论篇
◎单元测试和事先测试开发
◎为什么要进行单元测试?
◎JUnit中如何测试异常
◎单元测试作业指导书(四)
◎单元测试作业指导书(三)
◎单元测试作业指导书(二)
◎单元测试作业指导书(一)
◎单元测试中的伪对象
◎junit实现过程
◎以设计求质量--启用经济高效的全面组件测试
◎让编译和测试过程自动化
◎C语言高效编程的的四招技巧
◎ant结合junit进行软件自动测试
◎使用ant编译、运行junit、以及检查编码
◎JCoverage使用
◎全面介绍单元测试
◎单元测试指导
◎单元测试的基本方法
◎J2EE应用的性能调整--JPROBE使用篇
◎使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Te...
◎java单元测试篇:使用clover为java代码的junit测试做覆盖率分析(三)
◎java单元测试篇:使用clover为java代码的junit测试做覆盖率分析(二)
◎java单元测试篇:使用clover为java代码的junit测试做覆盖率分析(一)
◎数据库程序的单元测试
◎防御性编码和单元测试“交通规则”
◎单元测试实践(VB版)
◎Linux:让内存不再泄漏
◎感悟测试驱动开发
◎软件测试技术获重大突破
◎PHP单元测试工具PHPUnit初体验
◎使用NUnit在.Net编程中进行单元测试
◎Java性能的优化
◎Java内存泄漏分析
◎Java的内存泄漏
◎NUnit快速入门
◎单元测试方法
◎单元测试浅析
◎java的单元自动化测试---jtest
◎Java程序的单元测试
◎自动进行团队构建和单元测试过程
◎C语言单元测试框架-Check
◎在Eclipse中使用JUnit
◎EasyMock与JMock的比较
◎FindBugs第1部分: 提高代码质量
热门文章
◎全面介绍单元测试
◎单元测试------理论篇
◎Java内存泄漏分析
◎单元测试作业指导书(一)
◎junit实现过程
◎白盒测试中的六种覆盖方法
◎JUnit起步
◎单元测试方法
◎C/C++单元测试问答(摘要)
◎nunit使用资料
◎单元测试的基本方法
◎如何挑选白盒测试工具
◎NUnit快速入门
◎在Eclipse中使用JUnit
◎Java的内存泄漏
◎Linux:让内存不再泄漏
◎单元测试的小技巧介绍和举例
◎单元测试指导
◎为什么要进行单元测试?
◎单元测试作业指导书(二)
◎“白盒”静动测试两齐全
◎数据库程序的单元测试
◎静态测试
◎单元测试浅析
◎ant结合junit进行软件自动测试
◎单元测试作业指导书(三)
◎单元测试作业指导书(四)
◎CppUnit - 测试驱动开发入门
◎用cppUnit进行单元测试的步骤
◎java单元测试篇:使用clover为java代码的junit测试做覆盖率分析(一)
◎java的单元自动化测试---jtest
◎java单元测试篇:使用clover为java代码的junit测试做覆盖率分析(三)
◎使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Te...
◎C语言单元测试框架-Check
◎EasyMock与JMock的比较
◎Java程序的单元测试
◎JUnit中如何测试异常
◎怎样使用Junit Framework进行单元测试的编写
◎使用NUnit在.Net编程中进行单元测试
◎J2EE应用的性能调整--JPROBE使用篇
◎单元测试和事先测试开发
◎JBuilder单元测试实例
◎感悟测试驱动开发
◎单元测试实践(VB版)
◎软件测试技术获重大突破
◎C语言高效编程的的四招技巧
◎使用ant编译、运行junit、以及检查编码
◎JCoverage使用
◎让编译和测试过程自动化
◎自动进行团队构建和单元测试过程

Google提供的广告