플랫 php 테스트

10977 단어 PHPUnitComposerPHP

머리



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점
  • namespace
  • @runInSeparateProcess
  • ob_start, ob_get_clean

  • 테스트용 클래스
    <?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점
  • namespace
  • trait

  • 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 와 테스트 대상 폴더를 지정되고 있기 (위해)때문에입니다.
    커버리지도 표시할 수 있는 것 같습니다만, 표시할 필요도 없기 때문에, 여가가 있으면 합니다.

    좋은 웹페이지 즐겨찾기