플랫 php 테스트
머리
phpunit을 사용하면 php의 테스트로 곤란하지 않습니다.
다만, 오늘 밤까지다!
테스트 대상은 플랫 php. 클래스도 vendor도 없고 DB 액세스도 없습니다.
물론 composer도 사용하지 않습니다.
테스트 대상 php
<?php
namespace honya;
[$status, $res] = fncHonya();
header('HTTP/1.1 '.$status);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($res);
function fncHonya(){
// ちょこっとビジネスロジック
return [200, ['result'=>'ok']];
}
phpunit는 플랫 php를 테스트 할 수 없습니다!
처음 알았습니다. 플랫 php에서 개발한 적이 없었기 때문에.
테스트 코드를 만드는 것이 귀찮았습니다만, 지혜를 짜서 테스트할 수 있도록 해 보았습니다.
원본 파일 구성:
앱
└ honya.php
테스트할 수 있는 파일 구성:
앱
└ honya.php
└ compser.json
└ phpunit.xml
└ tests
└ HonyaTestClass.php
└ HonyaTest.php
└ fixtures
테스트용 클래스 만들기
HonyaTestClass를 만들고 honya.php를 require 한 메소드를 만들었습니다.
포인트는 3점
테스트용 클래스
<?php
namespace honya;
class HonyaTestClass {
private $header = [];
private $http_status = null;
private $body = null;
/**
* @runInSeparateProcess
*/
public function request(){
ob_start();
require 'honya.php';
$this->body = ob_get_clean();
$this->http_status = http_response_code();
$this->header = xdebug_get_headers(); //@TODO php7 xdebug
}
public function getHttpStatus(){ return $this->http_status; }
public function getHeader(){ return $this->header; }
public function getBody(){ return $this->body; }
}
네임 스페이스는 테스트 중에 필요하다는 것을 알았지만 실제로는 필요하지 않습니다.
성능에 영향이 없기 때문에 넣었습니다.
echo에서 body를 반환하기 위해 ob_start, ob_get_clean에서 echo 출력을 빼앗고 있습니다.
@runInSeparateProcess 을 붙이는 것으로 phpunit에 방해받지 않고, 테스트 대상의 echo 만 취득할 수 있습니다.
header 는 header_list() 로 취득할 수 없기 때문에 (원인 불명), xdebug_get_headers() 를 사용하고 있습니다. php5에서는 작동했지만 php7에서는 작동하지 않습니다 (원인 불명)
테스트 만들기
class마저 만들면 테스트 코드는 보통입니다.
HonyaTest.php(테스트 본체)
<?php
namespace honya;
require_once 'tests\HonyaTestClass.php';
require_once 'tests\HonyaTestUtil.php';
class HonyaTest extends \PHPUnit\Framework\TestCase {
use HonyaTestUtil;
/** @runInSeparateProcess */
public function test1() {
$body = 'honya body';
$this->init_function(200, $body);
$_POST['honya_param1'] = 'honya1';
$_SERVER['REQUEST_URI'] = '/honya';
$clazz = new \honya\HonyaTestClass();
$clazz->request();
$this->assertEquals('honya2 body', $clazz->getBody());
$this->assertEquals('200', $clazz->getHttpStatus());
// $this->assertSame([], $clazz->getHeader()); //@TODO php7 xdebug
}
}
테스트용 util 만들기
포인트는 2점
HonyaTestUtil.php()
<?php
namespace honya;
use phpmock\phpunit\PHPMock;
trait HonyaTestUtil {
use PHPMock;
public function init_function($http_status, $body){
$this->getFunctionMock(__NAMESPACE__, 'getenv')->expects($this->any())->willReturn('');
}
}
getFunctionMock 는 namespace 가 비어 있을 때 에러가 됩니다.
테스트 대상(honya.php)에 namespace 를 넣은 것은 그런 이유입니다.
HonyaTestUtil 은 class로 하고 있었습니다만, new 와 static 에서도 에러가 되므로, trait 로 했습니다.
./vendor/bin/phpunit
에서 실행할 수 있습니다.
phpunit.xml 의 디폴트로 autoload.php 와 테스트 대상 폴더를 지정되고 있기 (위해)때문에입니다.
커버리지도 표시할 수 있는 것 같습니다만, 표시할 필요도 없기 때문에, 여가가 있으면 합니다.
Reference
이 문제에 관하여(플랫 php 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ctrlzr/items/96b793a5f68fd4cce44d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)