美工统筹SEO,为企业电子商务营销助力!
举例详解PHP剧本的测试体例
一佰互联网站开辟设想(www.taishanly.com) 宣布日期 2020-04-27 10:45:01 阅读数: 114
一、常常利用测试示例
咱们常常会碰到这类环境:将一些不颠末任何测试的遗留代码停止从头编写测试,乃至这些代码仍是用面向东西写的。要对如许的代码停止测试,我的倡议是把代码分化成块,如许就轻易测试了。
但是,这些遗留代码并不是那末好重构的,比方:测试前,你不能在把代码从头编写,这是为了避免影响原有法式,固然也不好停止单位测试。
在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()。
具体代码
这便是咱们要测试的事件剧本东西,具体到剧本中,咱们还须要封装:
<?phpclass 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开辟者的单位测试东西包
在PHP范畴,单位测试的东西首要有PHPUNIT,PHPUNIT2和SimpleTest三种。此中PHPUNIT在功效上很简略,不算完美;PHPUNIT2是特地为PHP5写的单位测试东西,在布局和功效上都向Junit看齐;而SimpleTest则是一套很是适用的测试东西,此中的webTest撑持对web法式界面的测试,是Easy最为保举的一款测试东西。在本文中,咱们挑选SimpleTest停止先容。
相干常识:PHPUNIT2也是一款很好的东西,特别是架构上有良多值得圈点的处所,但愿未来能无机会在特地的文章中和大师分享。
SimpleTest:便是这么Simple
装置SimpleTest很简略,上sf.net高低载一个源码包,而后解压到web目次下就能够利用了,这里就未几说。
上面咱们先来看个例子:编写一个测试,查抄一个网站是不是能够拜候。
起首咱们引入要用到的文件:
代码列表:
require_once("../simpletest/unit_tester.php");require_once("../simpletest/web_tester.php");require_once("../simpletest/reporter.php");
而后咱们建立一个测试类:
代码列表:
class TestOfSite extends WebTestCase{ function TestOfSite() { $this->WebTestCase("测试"); } function testSite() { $this->get("http://howgo.net/prettyface/display.php"); $this->assertTitle(".: facebook :."); }}
起首咱们扩大了webTestCase类,如许咱们就能够主动获得测试web的才能,而后在机关函数中咱们间接利用基类的,只是把标题传给它。接着咱们就该写测试体例了,测试体例都因此‘test"开首的,用以辨认在咱们运转测试的时辰,类中哪些体例要停止挪用。
而$this->get将获得网页的内容,咱们指定它的标题为 ".: facebook :.", 接着咱们要做的便是实例化这个类的东西,并运转它。
代码列表:
$test = &new TestOfSite();$test->run(new HtmlReporter());
下边是运转成果:
若是测试犯错则会呈现下边的界面:
到这里一个简略的测试就算完成了。
实战练习 – 一个Login测试
上面咱们进入实战,在这个根本上完成一个login的测试。此次咱们先贴出完全的代码:
代码列表:
require_once("../simpletest/unit_tester.php");require_once("../simpletest/web_tester.php");require_once("../simpletest/reporter.php");class TestOfLogin extends WebTestCase{ function TestOfLogin() { $this->WebTestCase("Login测试"); } function testLoginOk() { // 获得页面 $this->get("http://howgo.net/prettyface/login.php"); // 增加测试表项 $this->setField("name","Easy"); $this->setField("pass","******"); // 提交 $this->clickSubmit("提交"); // 观察提交后前往页面是不是准确 $this->assertWantedPattern("/胜利登录/"); // 点击页面链接 $this->clickLink("点击这里进入办理页面"); // 观察指定页面标题和关头内容 $this->assertTitle("ADMINCP"); $this->assertWantedPattern("/请挑选要停止的使命/"); // 加入登岸 $this->clickLink("加入办理"); $this->clickLink }}
上一篇: PHP完成归并discuz用户 | 下一篇:利用Thinkphp框架开辟挪动端接口