小女巫 发表于 2015-2-4 00:15:26

PHP教程之用phpUnit帮你调试php法式

多个成员之间重复做相同的工作,很容易因为交流沟通的时候没有进行一致性的文档要求而出现不明错误,严重影响开发进度,导致在预定时间内无法完成该项目或者完成的项目跟原先计划所要实现的项目功能不符合。法式   调试法式是一个漫长的进程,法式越长越庞杂,调试起来就越发坚苦。假如你调试的是php法式,那末无妨采取phpUnit,它可以大大加速你的调试速度。
何谓PhpUnit
Phpunit 脱胎于Fred Yankowski编写的有名的Junit测试框架。你可以到它的网站 http://www.ontosys.com/phiki/phpunit 下载最新的版本。你可以使用phpUnit编写一套测试软件包。包管你的法式代码准确无误。只需一步即可主动完成一切的测试。
假如监测到bug,你就能够再写一小段测试代码来找失足误之地点。往后若再有不异的bug呈现,只需运转你先前的测试包,即刻就能够抓到它。常常运转测试包即可以包管你的法式代码的健壮性。
开 始
假定咱们有一个银行账务处置法式。如今需求为Account (账户) 类编写一个测试软件包。
以下是Account类 源代码:
<?php
 
class Account{
var $balance;
function Account($initialBalance=0){
$this->balance = $initialBalance;
}
function withdraw($amount){
$this->balance -= $amount;
}
function deposit($amount){
$this->balance += $amount;
}
function getBalance(){
return $this->balance;
}
function transferFrom(&$sourceAccount,$amount){
$sourceAccount->withdraw($amount);
$this->deposit($amount);
}
?>
 
创立一个测试类
 
起首,咱们创立一个测试类AccountTest,它是一个由PhpUnit供应的TestCase的子类。在这个TestCase类中有2个根基的办法:setUp和tearDown。 这2个办法的完成在父类中是空进程,必需由咱们本人去重载。个中SetUp 用于停止AccountTest类的初始化处置。在本例中,咱们对一些在测试顶用到的账号停止初始化。tearDown 则用于AccountTest类的清空处置,在本例中无需利用。因而,就不合错误它停止重载。如许AccountTester类的源代码以下:
 
<?php
 
class AccountTester extends TestCase{
var $_ac1;
var $_ac2;
var $_ac3;
var $_ac4;
 
function AccountTester($name){
$this->TestCase($name); // call parent constructor
}
function setUp(){
$this->_ac1 = new Account(100); // data for testWithdraw
$this->_ac2 = new Account(20); // data for testDeposit
$this->_ac3 = new Account(30); // data for testTransferFrom
$this->_ac4 = new Account(50);
}
}
?>
 
到场专门的测试代码
如今,咱们可以往向AccountTester类到场测试代码了。
 
<?php
 
// Make a withdrawal of 25 units from _ac1.
// _ac1's initial balance is 100
 
function testWithdraw(){
$this->_ac1->withdraw(25);
$this->assert($this->_ac1->getBalance() == 75); // 100 - 25 = 75
}
 
// Make a deposit of 10 units into _ac2.
// _ac1's initial balance is 20
 
function testDeposit(){
$this->_ac2->deposit(10);
$this->assertEquals(30,$this->_ac2->getBalance()); //20 +10 = 30
}
  
// Tranfers 10 units from _ac3 to _ac4
// _ac3's initial balance is 30
// _ac4's initial balance is 50
 
function testTransferFrom(){
$this->_ac4->transferFrom(&$this->_ac3,10);
$this->assertEquals(20,$this->_ac3->getBalance(),"Source account balance incorrect"); // 30 - 10 = 20
$this->assertEquals(60,$this->_ac4->getBalance(),"Target account balance incorrect"); // 50 + 10 = 60
}
 
?>
 
这段代码中,assert(好像C里的断言)办法是测试的关头局部。假如在assert中的前提表达式为真,那末测试经由过程。不然前往毛病。因为assert办法大都用于判别两个变量的值是不是相等。因而,testclass类引入了assertEquals办法专门完成这个功效。AssertEquals办法中有3个参数,顺次分离为:希冀值,测试值,两值不相等时前往的动静提醒串。
运转测试进程
好了,如今可以运转一下咱们编好的测试法式了。咱们还必需创立一个runtest.php测试法式来运转一切的测试进程。
 
runtest.php源代码以下:
 
<?php
$tSuite = new TestSuite(); //creation of the test suite object 创立测试套件对象
$tSuite->addtest(new AccountTester("testWithdraw")); //Add inidividual tests
$tSuite->addtest(new AccountTester("testDeposit")); //到场专门测试办法。
$tSuite->addtest(new AccountTester("testTransferFrom"));
$res = new TextTestResult(); //Creation of the Result 创立一个测试了局类
$tSuite->run(&$res); //Run of the test 运转测试
$res->report(); //Print results 输入测试了局。
?>
 
法式申明:
起首创立测试套件对象tSuite,然后一一到场专门测试办法,addtest办法的参数是测试办法的 再创立测试呈报对象,随之运转测试。测试发明毛病的了局由TestResult类捕获,TestResult可以定制一套text/html的毛病呈报。假如有需要你也能够本人编写输入局部。测试了局封装在TestResult类中,为了输入测试了局。咱们采取了phpUnit供应的别的一个类TextTestResult类,它可以输入文本或超文本格局的呈报。固然咱们也能够本人定制一个新的TestResult的子类掌握更庞杂的输入格局。
 
提醒和技能
1、在编写一个新的测试套件完成以后,咱们可以先引入一个小小的bug以证实测试套件可以正常运转。
好比,在本例account类中,咱们居心引入一个有成绩的函数。
<?php
function withdraw($amount){
$this->balance -= $Amount;
// 变量名巨细写毛病,本意是挪用$amount参数,了局引入一个新变量$Amount。
}
?>
好,如今让咱们运转测试套件,假如不出不测的话,咱们将很快发明毛病的地方。
2.要指出的是,并不是一切的办法都需求测试。你只需对相干的办法停止测试。
3.假如在入手下手编码前就写好测试代码,会使你更进一步分明你的法式究竟需求完成甚么样的义务。
如今,经由过程引入phpUnit的测试套件类,你可以发明找bug的工夫延长了,而你作为一个法式员的任务效力也进步了。
那末,纵情享用抓虫子的乐趣吧。祝您好胃口。基础这个东西,有人问学php需要任何基础不?

活着的死人 发表于 2015-2-4 10:10:08

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

深爱那片海 发表于 2015-2-20 23:50:21

这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。

柔情似水 发表于 2015-3-6 19:05:07

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

谁可相欹 发表于 2015-3-11 17:07:20

我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。

莫相离 发表于 2015-3-12 12:02:11

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

admin 发表于 2015-3-19 21:55:58

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

海妖 发表于 2015-3-27 01:10:27

使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的

精灵巫婆 发表于 2015-4-7 15:17:36

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。

金色的骷髅 发表于 2015-4-12 17:41:01

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

第二个灵魂 发表于 2015-4-16 23:11:35

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

若天明 发表于 2015-4-26 02:10:12

找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。

飘飘悠悠 发表于 2015-4-26 07:09:31

如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,

再见西城 发表于 2015-4-30 02:27:48

Ps:以上纯属原创,如有雷同,纯属巧合

只想知道 发表于 2015-5-6 08:11:26

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

变相怪杰 发表于 2015-6-8 22:50:36

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

分手快乐 发表于 2015-6-11 01:50:10

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

乐观 发表于 2015-6-18 19:54:32

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。

灵魂腐蚀 发表于 2015-7-7 17:16:23

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

若相依 发表于 2015-7-8 18:27:36

做为1门年轻的语言,php一直很努力。
页: [1]
查看完整版本: PHP教程之用phpUnit帮你调试php法式