文档章节

PHP脚本测试

迷途d书童
 迷途d书童
发布于 2012/05/05 21:23
字数 935
阅读 2702
收藏 30

我们经常会遇到这种情况:将一些没有经过任何测试的遗留代码进行重新编写测试,甚至这些代码还是用面向对象写的。要对这样的代码进行测试,我的建议是把代码分解成块,这样就容易测试了。

然而,这些遗留代码并不是那么好重构的,比如:测试前,你不能在把代码重新编写,这是为了避免影响原有程序,当然也不好进行单元测试。

在PHP程序中,通常有一部分代码是写在几个index.php和script.php文件中的,这些.php文件存放在几个不同的文件夹里。如果不找到它们的入口点,是无法直接由Web服务器访问的。

测试副本

要测试一个PHP脚本,我们需要模拟一个HTTP请求,并检查返回的响应(response)是否等于预期值。这里需要注意的是模拟一个请求,要定义response和request,这不仅仅是内容(content)的不同,而且他们的头信息(header)也是不同的。

此外,如果我们想要测试一个操作数据的事务脚本,我们要确保不让它去连接真正的数据库或应用程序的其余部分。

在现实中,通常没有人会直接拿原有的PHP脚本进行重写测试。因为怕把代码弄得不可恢复。我建议使用PHP脚本的副本,这样我们就可以将PHP代码进行一些小手术了。

如何将代码进行最小修改:删除include和require语句(如果它们没有被用到),并且修改内部函数的调用方式,例如:将header()写成$object->header()。

最后,我们来测试这个事务脚本。测试完后,我们可以从副本脚本中提取出它们,并把它们放入新脚本文件中。

具体步骤

一、模拟一个HTTP请求并重新定义变量$_GET和$_POST,还要修改$_SERVER的header。

二、获取请求响应,response的body可以通过ob_start()和ob_get_clean()捕获,它可以收集每一个用echo()或以<?php标签输出的buffer(缓冲内容)。

注意:输出缓冲支持在PHP多个级别的嵌套,所以在大多数情况下,都可以捕获到,即使脚本在使用ob_*调用本身。

三、测试脚本应包含事务脚本的内部方法,因此在这个脚本范围内的方法都可以被调用。例如:
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()的内容替换成真正的逻辑代码。假如你要写很多这样的测试脚本,你可以写一个通用的测试对象,以满足你的测试需要。

原文链接OSChina.NET原创翻译

© 著作权归作者所有

共有 人打赏支持
迷途d书童

迷途d书童

粉丝 1021
博文 144
码字总数 14138
作品 0
深圳
高级程序员
私信 提问
加载中

评论(8)

x
xuetu
博主的意思是我们模拟请求,给测试文件需要的内容赋值?从而测试吗?因为我是菜鸟,代码是没看懂,不知道猜得对不对?
某个
某个

引用来自“迷途d书童”的评论

引用来自“某个”的评论

嗯,苦涩难懂。求讲解。

就是模拟http请求,进行php脚本测试

谢谢,明白。
迷途d书童
迷途d书童

引用来自“某个”的评论

嗯,苦涩难懂。求讲解。

就是模拟http请求,进行php脚本测试
某个
某个
嗯,苦涩难懂。求讲解。
工程师爸爸
工程师爸爸
我看得不知所以然,不知道要干嘛……可能我比较新手吧。
antipro
antipro
PHP也能重构?
迷途d书童
迷途d书童
$headerline = get_headers($url);
fzxu_05
fzxu_05
private function header($headerLine)

这个参数是啥?、

'headers' => $this->headers
实例证明 PHP 5.4 是否比 PHP 5.3 快两倍

最近我对不同版本的 PHP 进行了性能的测试,因为我听说 PHP 5.4 速度非常快,我是一个数据极客,因此我想知道 PHP 5.4 到底有多快。不过测试结果的确是比 PHP 5.3 快,但不止两倍。 我首次进...

彭博
2012/11/27
622
0
实例证明 PHP 5.4 是否比 PHP 5.3 快两倍

最近我对不同版本的 PHP 进行了性能的测试,因为我听说 PHP 5.4 速度非常快,我是一个数据极客,因此我想知道 PHP 5.4 到底有多快。不过测试结果的确是比 PHP 5.3 快,但不止两倍。 我首次进...

红薯
2012/06/17
18.2K
53
禅道自动化测试框架--ZenTaoATF

ZenTaoATF是由禅道开发团队开发的自动化测试框架,它只有一个脚本文件,可以支持各种脚本语言编写的自动化测试脚本,语法简单,使用灵活,后续会和禅道项目管理软件进行绑定和集成。 它的基本...

开源春哥
2013/03/19
8.3K
0
PHP_SELF,SCRIPT_NAME,SCRIPT_FILENAME,PATH_INFO,REQUEST_URI的区别

PHPSELF,SCRIPTNAME,SCRIPTFILENAME,PATHINFO,REQUEST_URI的区别 2011年03月26日 JeremyWei 前言 PHP的$SERVER数组中存在五个和路径相关的变量:,, ,,,这五个变量经常会被混淆,做下...

吾爱
2016/12/22
91
0
18.4. zabbix-agent

# sudo apt-get install zabbix-agent /etc/zabbix/zabbix_agent.conf #Server=localhostServer=yourserverip_address # vim /etc/services zabbix-agent 10050/tcp #Zabbix Agentzabbix-age......

玄学酱
01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
10分钟前
1
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
17分钟前
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
59分钟前
6
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
今天
4
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部