[PHP] PHPUnit Test 환경구성 및 테스트

2022. 4. 14. 23:57·Front-End/Web
728x90

 

본 글에서는 PHP로 작성된 코드의 Unit Test 환경구성 및 테스트에 대해 다룬다.

테스트 환경은 Linux Rocky 8 버전에서 php 7.3버전에서 수행한다. 

 

환경구성

 

(1) php install

 

php 7.3 version을 설치한다. 설치 방법은 아래 참고사이트 [1]번 링크를 참조한다. 


(2) composer install

php 패키지 관리자 'composer'를 설치한다. 

$ curl -sS https://getcomposer.org/installer | php


 
(3) phpunit install

php 7.3 버전에 호환되는 phpunit phpunit 9.3 버전을 설치한다. 

$ php composer.phar require --dev phpunit/phpunit ^9.3


(3) phpunit.xml 구성

<?xml version="1.0" encoding="UTF-8"?>
<phpunit 
  processIsolatio = "true"
  colors = "true"
  backupGlobals = "true"
  stderr = "true"
>
  <coverage
    includeUncoveredFiles="false">
  </coverage>
  <php>
    <includePath>web-admin/lib</includePath> <!-- PATH -->
  </php>
</phpunit>

 

php 또는 unit에 필요한 옵션정보를 xml로 구성하여 사용하거나 매 실행마다 명령어로 입력한다.

자세한 구성 정보는 아래 공식 문서 또는 블로그 내용을 참고한다. 


공식문서:
 The XML Configuration File — PHPUnit 9.5 Manual

https://phpunit.readthedocs.io/en/9.5/configuration.html?highlight=xml

 블로그: PHPUnit - XML 구성 파일 - https://runebook.dev/ko/docs/phpunit/configuration


 

 

TestCode 작성


(1) Code Example

아래는 예시 코드이다. 첫 번째 코드는 입력 받은 매개변수의 평균값을 구하고 변환하는 함수이며, 두 번째 코드는 첫 번째 코드의 기댓값을 대입하여 테스트하는 테스트 코드이다. 

<?php
function avg()
{
    $args = func_get_args();
    $sum = 0;
    foreach ($args as $val) {
        $sum += $val;
    }
    $avg = $sum / count($args);
    return $avg;
}
?>

 

<?php
include 'calc.php';
use PHPUnit\Framework\TestCase;

class CalcTest extends TestCase
{
    public static function setUpBeforeClass(): void
    {   
        fwrite(STDOUT, "\nStart clac Test\n");  
    }

    public static function tearDownAfterClass(): void
    {
        fwrite(STDOUT, "\nEnd clac Test\n"); 
    }
    
    protected function setUp(): void {}
    
    public function testAvg()
    {
        $result = avg(10, 20, 30);
        $empty=null;
        
        $this->assertEquals(20, $result);
        $this->assertNotEquals(25, $result);

        $this->assertSame(10,10);
        $this->assertNotSame(10,15);

        $this->assertTrue(true);
        $this->assertFalse(false);

        $this->assertEmpty($empty);
        $this->assertNotEmpty($result);

        //$this->assertInstanceOf(CalTest::class, new CalTest);
        //$this->assertNotInstanceOf(CalTest::class, new CalTest);
    }
}
?>

 

 

(2) Class 구조

  • 테스트 모듈은 클래스로 작성해야 하며,  작성한 클래스는 TestCase를 상속받아야 한다.
  • 1개 이상의 단위 테스트 함수가 존재해야 하며, 함수명은 test로 시작해야 한다.
  • 파일 상단에 아래와 같이 TestCase use하여 추가한다.
use PHPUnit\Framework\TestCase;



  가. setUpBeforeClass()
    테스트 모듈 시작 최초에 1회만 실행된다. 

public static function setUpBeforeClass(): void{}


  나. tearDownAfterClass()
    테스트 모듈 종료 1회만 실행된다. 

public static function tearDownAfterClass(): void{}


  다. setUp()
    각 테스트(함수) 실행시 실행된다. 

protected function setUp(): void {}


※ PHP 생성자(__construt())는 사용할 수 없다. 

 

(3) 테스트 함수 목록

  가. 데이터에 의한 비교 테스트

  • 첫 번째 인수(기댓값)와 두 번째 인수(비교값)을 비교하는 테스트 함수이다.
  • assertNotEquals는 assertEquals의 역이며, 인수는 같다.
assertEquals(20, $result);
assertNotEquals(25, $result);


  나. 데이터 타입과 데이터에 의한 비교. 테스트  (가 .와 큰 차이는 모르겠다.)

  • assertNotSame은 assertSame의 역이며, 인수는 같다.
assertSame(10,10);
assertNotSame(10,15);


다. bool Type에 따른 테스트

  • bool Type에 따른 테스트 함수이다.
assertTrue(true);
assertFalse(false);


라. Empty에 따른 테스트

  • 변수의 공백에 따른 테스트 함수이다.
assertEmpty($empty); 
assertNotEmpty($result);



마. 객체 인스턴스 비교 테스트

  • 두 번째 인수(테스트 객체)가 첫 번째(비교 클래스) 인수에 포함되는 객체인지 테스트하는 함수이다.
  • assertNotInstanceOf는 assertInstanceOf의 역이며, 인수는 같다.
assertInstanceOf(CalTest::class, new CalTest);
assertNotInstanceOf(CalTest::class, new CalTest);


각 테스트 함수에 마지막 매개변수로 오류메세지를 추가하여 오류 메세지를 출력할 수 있다.

assertEquals(20, $result, "Not Equals !!!!!!");


이외 자세한 내용은 아래  참고사이트의 [2] 공식문서를 참고한다. 


 

 

 TestCode 실행

 

$ php vendor/bin/phpunit testdir/unit

 

※ xml 파일에 옵션 값을 구성하였다면 명령줄에 옵션을 포함하지 않는다.

 

 

 

참고사이트

 

[1] RHEL/CentOS 8 에 PHP 7.3 설치하기 블로그 -  https://www.lesstif.com/php-and-laravel/rhel-centos-8-php-7-3-89555635.html

 

[2] phpunit 9.5 공식 메뉴얼 -  https://phpunit.readthedocs.io/en/9.5/installation.html​

 

 

 

 

※ 본 게시글의 정보가 잘못 되었거나 부족한 부분에 대한 피드백을 환영합니다.

 

 

* CopyRight 2022. Jay Park All rights reserved.

728x90
저작자표시 비영리 변경금지 (새창열림)

'Front-End > Web' 카테고리의 다른 글

[Web] JWT Web Token 기초  (0) 2023.08.10
[Apache] 특정 디렉터리 Http Authentication 적용  (0) 2022.07.24
'Front-End/Web' 카테고리의 다른 글
  • [Web] JWT Web Token 기초
  • [Apache] 특정 디렉터리 Http Authentication 적용
dev.parkjh
dev.parkjh
Jay Blog. Github: https://github.com/GreatPark96
  • dev.parkjh
    0과 1을 공부하다.
    dev.parkjh
  • 전체
    오늘
    어제
    • 분류 전체보기 (114)
      • Profile (2)
      • Paper (6)
      • Column (3)
      • Project (8)
        • Smart Home (3)
        • 3D Printing (5)
      • Front-End (0)
        • Web (3)
      • Back-End (8)
        • API (1)
        • DB (1)
        • Laravel (4)
      • Language (16)
        • Kotlin (11)
        • C, C++ (3)
        • JAVA (0)
        • python (2)
      • System (28)
        • Server (15)
        • Security (1)
        • Network (1)
        • Linux (8)
        • Cloud (3)
      • ETC (34)
        • Book Recommend (Computer) (3)
        • IoT (7)
        • BlockChain (7)
        • ETC (17)
      • My YOLO (1)
      • Note (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    gitlab
    ci/cd
    3D모델링
    C언어
    linux job
    리눅스 파일동기화
    data serialization formats
    3D프린터 입문
    ncp container registry
    docker private register
    NAS HDD교체
    Database
    nas
    docker container
    3D프린터
    Kotlin
    네이버클라우드
    github
    Jenkins
    git
    coderabbit
    work hour
    ai code review
    kubernetes
    3d프린터 초보
    코틀린개발환경
    데이터 직렬화 포맷
    docker
    3D
    Notification
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dev.parkjh
[PHP] PHPUnit Test 환경구성 및 테스트
상단으로

티스토리툴바