|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
然后大吼:别人可以,我为什么就不可以?(是不是有点阎罗教练的味道,默默的确是电影看多了,抽嘴巴是会痛的,各位其实明白这个道理了就行了) 咱们常常会碰到这类情形:将一些没有经由任何测试的遗留代码停止从头编写测试,乃至这些代码仍是用面向对象写的。要对如许的代码停止测试,我的建议是把代码分化成块,如许就轻易测试了。
但是,这些遗留代码并非那末好重构的,好比:测试前,你不克不及在把代码从头编写,这是为了不影响原有法式,固然也欠好停止单位测试。
在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开发(第三版)》号称圣经级,(也许是个不错的选择(声明:作者没给我啥好处费,我也不是书托,隔着大老远,我连他老兄的面都没见过的说-_-) |
|