html5中文学习网

您的位置: 首页 > 网络编程 > PHP编程 » 正文

PHP脚本测试_PHP教程_编程技术

[ ] 已经帮助:人解决问题

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

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

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

  测试副本jWrHTML5中文学习网 - HTML5先行者学习网

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

  此外,如果我们想要测试一个操作数据的事务脚本,我们要确保不让它去连接真正的数据库或应用程序的其余部分。jWrHTML5中文学习网 - HTML5先行者学习网

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

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

  最后,我们来测试这个事务脚本。测试完后,我们可以从副本脚本中提取出它们,并把它们放入新脚本文件中。jWrHTML5中文学习网 - HTML5先行者学习网

  具体步骤jWrHTML5中文学习网 - HTML5先行者学习网

  一、模拟一个HTTP请求并重新定义变量$_GET和$_POST,还要修改$_SERVER的header。jWrHTML5中文学习网 - HTML5先行者学习网

  二、获取请求响应,response的body可以通过ob_start()和ob_get_clean()捕获,它可以收集每一个用echo()或以jWrHTML5中文学习网 - HTML5先行者学习网

  注意:输出缓冲支持在PHP多个级别的嵌套,所以在大多数情况下,都可以捕获到,即使脚本在使用ob_*调用本身。jWrHTML5中文学习网 - HTML5先行者学习网

  三、测试脚本应包含事务脚本的内部方法,因此在这个脚本范围内的方法都可以被调用。例如:jWrHTML5中文学习网 - HTML5先行者学习网

  1.脚本所需的变量可以被定义为局部变量封装起来,如$connection作为一个数据库连接。jWrHTML5中文学习网 - HTML5先行者学习网

  2.不是原本PHP的内置函数,应该加上对象来调用,如:header()写成$this->header()。jWrHTML5中文学习网 - HTML5先行者学习网

  具体代码jWrHTML5中文学习网 - HTML5先行者学习网

  这就是我们要测试的事务脚本对象,具体到脚本中,我们还需要封装:jWrHTML5中文学习网 - HTML5先行者学习网

 jWrHTML5中文学习网 - HTML5先行者学习网

  <?phpjWrHTML5中文学习网 - HTML5先行者学习网

  class ForumPostingjWrHTML5中文学习网 - HTML5先行者学习网

  {jWrHTML5中文学习网 - HTML5先行者学习网

  private $headers = array();jWrHTML5中文学习网 - HTML5先行者学习网

  public function handleRequest($postRequest)jWrHTML5中文学习网 - HTML5先行者学习网

  {jWrHTML5中文学习网 - HTML5先行者学习网

  $_POST = $postRequest;jWrHTML5中文学习网 - HTML5先行者学习网

  $connection = $this->getAConnection();jWrHTML5中文学习网 - HTML5先行者学习网

  ob_start();jWrHTML5中文学习网 - HTML5先行者学习网

  include 'forum/post_new_copy.php';jWrHTML5中文学习网 - HTML5先行者学习网

  $content = ob_get_clean();jWrHTML5中文学习网 - HTML5先行者学习网

  return array(jWrHTML5中文学习网 - HTML5先行者学习网

  'content' => $content,jWrHTML5中文学习网 - HTML5先行者学习网

  'headers' => $this->headersjWrHTML5中文学习网 - HTML5先行者学习网

  );jWrHTML5中文学习网 - HTML5先行者学习网

  }jWrHTML5中文学习网 - HTML5先行者学习网

  private function header($headerLine)jWrHTML5中文学习网 - HTML5先行者学习网

  {jWrHTML5中文学习网 - HTML5先行者学习网

  $this->headers[] = $headerLine;jWrHTML5中文学习网 - HTML5先行者学习网

  }jWrHTML5中文学习网 - HTML5先行者学习网

  ...jWrHTML5中文学习网 - HTML5先行者学习网

  }jWrHTML5中文学习网 - HTML5先行者学习网

 jWrHTML5中文学习网 - HTML5先行者学习网

  这是我们的测试代码:jWrHTML5中文学习网 - HTML5先行者学习网

 jWrHTML5中文学习网 - HTML5先行者学习网

  public function testANewPostIsCreated()jWrHTML5中文学习网 - HTML5先行者学习网

  {jWrHTML5中文学习网 - HTML5先行者学习网

  $action = new ForumPosting();jWrHTML5中文学习网 - HTML5先行者学习网

  $response = $action->handleRequest(array(jWrHTML5中文学习网 - HTML5先行者学习网

  'id_thread' => 42,jWrHTML5中文学习网 - HTML5先行者学习网

  'text' => 'Hello, world',jWrHTML5中文学习网 - HTML5先行者学习网

  ...jWrHTML5中文学习网 - HTML5先行者学习网

  ));jWrHTML5中文学习网 - HTML5先行者学习网

  $this->assertEquals('...', $response['content']);jWrHTML5中文学习网 - HTML5先行者学习网

  $this->assertContains('Content-type: text/html', $response['headers']);jWrHTML5中文学习网 - HTML5先行者学习网

  }jWrHTML5中文学习网 - HTML5先行者学习网

 jWrHTML5中文学习网 - HTML5先行者学习网

  结论jWrHTML5中文学习网 - HTML5先行者学习网

  测试副本只是暂时的!它让我们编写的测试不会改变。最终,我们要将已经通过测试的PHP脚本进行重构,以消除冗余代码。jWrHTML5中文学习网 - HTML5先行者学习网

  当我们的测试完成后,可以将handleRequest()的内容替换成真正的逻辑代码。假如你要写很多这样的测试脚本,你可以写一个通用的测试对象,以满足你的测试需要。jWrHTML5中文学习网 - HTML5先行者学习网

jWrHTML5中文学习网 - HTML5先行者学习网
jWrHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助