PHP教程之PHP剧本测试
然后大吼:别人可以,我为什么就不可以?(是不是有点阎罗教练的味道,默默的确是电影看多了,抽嘴巴是会痛的,各位其实明白这个道理了就行了) 咱们常常会碰到这类情形:将一些没有经由任何测试的遗留代码停止从头编写测试,乃至这些代码仍是用面向对象写的。要对如许的代码停止测试,我的建议是把代码分化成块,如许就轻易测试了。但是,这些遗留代码并非那末好重构的,好比:测试前,你不克不及在把代码从头编写,这是为了不影响原有法式,固然也欠好停止单位测试。
在PHP法式中,凡是有一局部代码是写在几个index.php和script.php文件中的,这些.php文件寄存在几个分歧的文件夹里。假如不找到它们的进口点,是没法直接由Web办事器会见的。
测试正本
要测试一个PHP剧本,咱们需求摹拟一个HTTP恳求,并反省前往的呼应(response)是不是等于预期值。这里需求注重的是摹拟一个恳求,要界说response和request,这不单单是内容(content)的分歧,并且他们的头信息(header)也是分歧的。
另外,假如咱们想要测试一个操作数据的事务剧本,咱们要确保不让它去毗连真实的数据库或使用法式的其他局部。
在实际中,凡是没有人会直接拿原本的PHP剧本停止重写测试。由于怕把代码弄得不成恢复。我建议利用PHP剧本的正本,如许咱们就能够将PHP代码停止一些小手术了。
若何将代码停止最小修正:删除include和require语句(假如它们没有被用到),而且修正外部函数的挪用体例,例如:将header()写成$object->header()。
最初,咱们来测试这个事务剧本。测试完后,咱们可以从正本剧本中提掏出它们,并把它们放入新剧本文件中。
详细步调
1、摹拟一个HTTP恳求偏重新界说变量$_GET和$_POST,还要修正$_SERVER的header。
2、获得恳求呼应,response的body可以经由过程ob_start()和ob_get_clean()捕捉,它可以搜集每个用echo()或以
注重:输入缓冲撑持在PHP多个级其余嵌套,所以在大多半情形下,都可以捕捉到,即便剧本在利用ob_*挪用自己。
3、测试剧本应包括事务剧本的外部办法,因而在这个剧本局限内的办法都可以被挪用。例如:
1.剧本所需的变量可以被界说为部分变量封装起来,如$connection作为一个数据库毗连。
2.不是本来PHP的内置函数,应当加上对象来挪用,如:header()写成$this->header()。
详细代码
这就是咱们要测试的事务剧本对象,详细到剧本中,咱们还需求封装:
<?php
class ForumPosting
{
private $headers = array();
public function handleRequest($postRequest)
{
$_POST = $postRequest;
$connection = $this->getAConnection();
ob_start();
include 'forum/post_new_copy.php';
$content = ob_get_clean();
return array(
'content' => $content,
'headers' => $this->headers
);
}
private function header($headerLine)
{
$this->headers[] = $headerLine;
}
...
}
这是咱们的测试代码:
public function testANewPostIsCreated()
{
$action = new ForumPosting();
$response = $action->handleRequest(array(
'id_thread' => 42,
'text' => 'Hello, world',
...
));
$this->assertEquals('...', $response['content']);
$this->assertContains('Content-type: text/html', $response['headers']);
}
结论
测试正本只是临时的!它让咱们编写的测试不会改动。终究,咱们要将已经由过程测试的PHP剧本停止重构,以消弭冗余代码。
当咱们的测试完成后,可以将handleRequest()的内容交换成真实的逻辑代码。假设你要写良多如许的测试剧本,你可以写一个通用的测试对象,以知足你的测试需求。
《PHP+MYSQL WEB开发(第三版)》号称圣经级,(也许是个不错的选择(声明:作者没给我啥好处费,我也不是书托,隔着大老远,我连他老兄的面都没见过的说-_-) php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。 曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ; 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 本文当是我的笔记啦,遇到的问题随时填充 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql Ps:以上纯属原创,如有雷同,纯属巧合
页:
[1]