今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了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-----------
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-----------
require_once 'testcase.php';
require_once 'PHPUnit.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. http://developer.51cto.com/art/200809/87882.htm

PHP单元测试工具phpunit安装(windows版)

简述:本程序是经过本人测试后才发布上来的,这样减少误差。

环境:

php5.2.9-2,

apach2.2.11.

windows xp

1 安装pear

1) 安装前的工作 安装PHP后所产生的文件夹下面有一个go-pear.bat文件

(我的php环境D:\wamp\bin\php\php5.2.9-2) 2) 执行installer 双击go-pear.bat,有问答时 用y,然后Enter,其它全部按“Enter” 3) 追加路径 打开你的php.ini文件,在 ; Paths and Directories ; (我的路径D:\wamp\bin\php\php5.2.9-2\PEAR) 下面看一下有没有"include-path=",没有就追加,有的话就加写pear include-path=".;C:\PHP;C:\PHP\smarty\libs; D:\wamp\bin\php\php5.2.9-2\PEAR" 4) 查看PHP文件夹 除了go-pear.bat文件,又多了pear.bat和PEAR_ENV.reg 5) 注册表的修改 双击PEAR_ENV.reg文件,选择“ok”,即可完成修改 6) 环境参数的自动设定 双击pear.bat文件即可 7) 确认安装成功与否 打开运行cmd,cd D:\wamp\bin\php\php5.2.9-2

输入 "pear version"

显示版本为1.7.2

输入“pear list”看安装在文件夹pear下面library是否都显示出来了

如果没有Benchmark

请加入 pear install Benchmark

2 pear升级

pear upgrade pear   (更新pear) 显示版本为1.9.4

比原来版本高吧,表示升级成功。

3 安装phpunit

pear channel-discover pear.phpunit.de pear channel-discover components.ez.no pear channel-discover pear.symfony-project.com

pear install --alldeps phpunit/PHPUnit[安装PHPUnit的所有元素] (pear install phpunit/PHPUnit只安装一部分文件,之后会报错,解决方法删掉php/pear/phpunit,再执行pear install --alldeps phpunit/PHPUnit)

测试是否安装成功:

phpunit --version 看到版本信息了吗,哈哈,恭喜,表示安装成功!

头一次使用这种东西,开始有些手忙脚乱,弄了二天了,终于有点眉目了,记录一下过程。

  以下都是在windows下进行,我的php版本是php-5.1.4-win32

  因为phpunit要通过pear安装,所以首先要安装pear

  找到php的目录下有一个go-pear.bat,双击运行,提示你安装系统级别的还是一个本地拷贝,直接回车,定制安装目录,选择默认即可,直接回车。程序会自动从网站上下载所需要的文件,过一会就提示你安装好了。

  安装好pear后,在php的目录下发现有一个pear.bat,这个是pear安装包用的程序,

  在命令行进行php目录,输入 pear install phpunit2

  即可,安装完成。

  在php目录下会生成一个phpunit.bat,这个是命令行下的测试命令。

  我们可以把他复制到我们要测试程序的目录下面。

  在命令行下输入 phpunit sampleTest

  就是对sampleTest这个case进行测试了。

  有二点需要注意的地方:

  phpunit需要pear的benchmark包,所以要安装 pear install benchmark即可。

  在windows下安装完成后还不能直接进行测试,运行测试程序时会出现 'php'不是内部或外部命令,也不是可运行的程序。的错误,经我一路跟踪,最后在PHPUnit2/Util/Fileloader.php这个文件里找到了问题所在,这个文件是载入测试文件用的,同时使用php解释器进行了语法检查,shell_exec('php -l ' . escapeshellarg($filename));,而我的php.exe并没有在系统的path中,所以出现了上述问题,一种办法是将$output到include之前的代码全部注释掉,这样就不用语法检查了,还有一种办法就是在系统path中加入php的安装目录。

三、--------------------

搞单元测试的大概步骤是:编写待测试类,编写测试用例类,编写测试类,测试。

单元测试首先就是要安装测试的类库了,用pear安装PHPUnit,window下这样操作,首先安装pear,在pear下发现phpunit的频道pear channel-discover pear.phpunit.de,然后安装之pear install phpunit/PHPUnit(使用这条指令,将不会完全安装PHPUnit的所有元素,请使用pear install --alldepsphpunit/PHPUnit),这时在php\pear会有PHPUnit.php和PHPUnit文件夹,这样就安装好了。

首先编写待测试类,这里用一个计算器作为例子,计算器类为代码一:

class calculator{
function add($p1,$p2)
{
return $p1+$p2;
}
} 编写测试用例类,这个类引入了PHPUnit.php和待测试的计算器类,然后初始化待测试类,编写断言。 require_once("c8-2.php");
require_once("PHPUnit.php"); class calculatorTest extends PHPUnit_TestCase
{
public $o;
//开始的时候初始化一个待测试类
function setUp()
{
$this->o = new calculator();
}
//最后消亡的时候清除掉这个类
function tearDown() {
unset($this->o);
}
function testadd()
{
$r = $this->o->add(1,2);
$e = 5;
//assertEquals和assertTrue基本一样,不过这个返回的参数更加详细
//这里的1+2肯定等于3,我们故意写错看下他的反应。注意这里是故意写错,实际测试时,这些结果必须是完全正确的,因为它的功能就是检测类方法是否正确。
$this->assertEquals($r,$e);
}
function testadd2()
{
$r = $this->o->add(102,106);
$e = 208;
$this->assertTrue($r == $e);
} } 最后编写测试类,不编写这个类也可以,在命令行下直接跑phpunitcalculatorTest就行。 require_once("testc8-2.php");
require_once("PHPUnit.php");
//载入测试用例
$s = new PHPUnit_TestSuite("calculatorTest");
//测试
$r = PHPUnit::run($s);
//测试结果
echo $r->toString();
//print_r($r); 跑一边这个测试类就可以了,它输出了测试用例中所有的测试结果。如果你有多个类,多个测试类的test类,那么可以编写一个AllTests套件。包含所有的待测试的测试类,然后在phpunit下统一执行就行。这个类可能是这样的: <?php
require_once 'PHPUnit/Framework.php';
require_once 'PHPUnit/TextUI/TestRunner.php';//这里引入了这个文件 require_once 'DemoTest.php'; //引入了两个测试类
require_once 'calculatortest.php'; class AllTests {
public static function main() {
PHPUnit_TextUI_TestRunner::run(self::suite());
} public static function suite() {
$suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend');
$suite->addTestSuite('DemoTest'); //最佳测试类
$suite->addTestSuite('calculatortest');
return $suite;
}
}

PHP单元测试工具PHPUnit初体验的更多相关文章

  1. C++ Profiler工具之初体验

    http://www.cnblogs.com/likwo/archive/2012/12/20/2826988.html 转 http://www.cnblogs.com/lenolix/archiv ...

  2. 录制简单的自动化测试工具SlikMobile初体验

    今天朋友推荐了款自动化测试工具SlikMobile,下载了个试用了下,感觉还是很容易入门和上手的,感觉和testin的工具差不多,跨平台,多语言支持,支持图片.文本和Native Class三种对象方 ...

  3. 【转】阿里出品的ETL工具dataX初体验

    原文链接:https://www.imooc.com/article/15640 来源:慕课网 我的毕设选择了大数据方向的题目.大数据的第一步就是要拿到足够的数据源.现实情况中我们需要的数据源分布在不 ...

  4. windows 下 wamp php单元测试工具PHPUnit的安装

    phpunit下载网站 http://www.phpunit.cn/ 一.安装PHPUnit 1.选择版本 我用的是php版本是5.6.25 所以我选择的是PHPUnit 5.7 2.安装过程 为 P ...

  5. 前端工业化工具Grunt初体验

    今天来学学Grunt~~目的是为了自动化!自动压缩...自动修复...自动合并等... 提示:Grunt基于Node.js,安装之前要先安装Node.js 1.安装 grunt-cli npm ins ...

  6. 无线安全审计工具FruityWifi初体验

    FruityWIfi是一款有名的无线安全审计的开源工具,其灵感来自于wifipineapple,目前该工具已经更新到2.4.它能够让用户通过web界面来控制和管理模块,十分方便.FriutyWifi最 ...

  7. 前端工业化工具Gulp初体验

    1. 全局安装 gulp: npm install --global gulp 2.在项目目录下,用以下命令创建一个基本的package.json文件 npm init 3.安装Gulp npm in ...

  8. 自动测试工具agitarOne 初体验之-MockingBird的使用

    大名鼎鼎的AgitarOne就不用解释了,在昨天的随笔中有一些解释,今天主要说说Agitar 中Mockingbird的使用.          为了提高测试代 码的Coverage,仅仅靠Agita ...

  9. Jmeter工具使用初体验

    一.Jmeter组成部分 一个完整的脚本必须包含以下三项,他们都在测试计划的子选项中,我们直接在测试计划上右键选择即可 线程组 取样器 监视器 二.脚本编写 1.创建线程组 2.添加取样器 我们这里添 ...

随机推荐

  1. The service ‘xxx’ configured for WCF is not registered with the Autofac container

    最近在使用autofac.wcf时,报如下异常: Exception Details: System.InvalidOperationException: The service 'xxx' conf ...

  2. 【转】System.DateTime.Now.ToString()的一些用法

    C#中的日期处理函数     //2007年4月24日     this.TextBox6.Text = System.DateTime.Now.ToString("D");    ...

  3. What is the difference between Views and Materialized Views in Oracle?

    aterialized views are disk based and update periodically base upon the query definition. Views are v ...

  4. Android 注意在finish Activity之后也要停止正在运行的请求

    如果在一个Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,如果Activity被结束了,则我们需要写如下代码作为防守: @Override public void onPost ...

  5. cojs 简单的01串 题解报告

    题意显然是求n位二进制串中不大于其逆序串,取反串,逆序取反串的所有串按字典序排序后的第k个 由于n很小,k很大所以我们可以考虑逐位确定 问题转化为了求方案数,这显然是可以用数位DP做的 设f[len] ...

  6. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  7. lintcode : 二叉树的序列化和反序列化

    题目 二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制 ...

  8. PHP获取服务器的mac地址类

    PHP获取服务器的mac地址类,不是客户端的. <?php class GetMacAddr{ var $return_array = array(); // 返回带有MAC地址的字串数组 va ...

  9. 247. Strobogrammatic Number II

    题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...

  10. 第二十二章 CLR寄宿和AppDomain

    1. 概念解析 CLR Hosting(CLR 宿主):初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只不过由于PE ...