PHP

PHP 유닛 테스트 작성하기

thebasics 2024. 9. 11. 10:00

목차
1. 유닛 테스트란 무엇인가?
   - 유닛 테스트의 개념
   - 왜 유닛 테스트를 작성해야 하는가?
2. PHPUnit 설치 및 설정
   - Composer를 사용한 설치
   - phpunit.xml 설정 파일 작성
3. 기본 테스트 작성법
   - 테스트 클래스 및 메서드 작성
   - 주요 Assertion 메서드
4. 테스트 실행 및 결과 확인
   - 테스트 실행
   - 결과 분석 및 오류 수정
5. 코드 예제
6. 결론 및 추가 학습 자료


1. 유닛 테스트란 무엇인가?

유닛 테스트의 개념

유닛 테스트(Unit Test)는 소프트웨어의 개별 구성 요소(유닛)를 테스트하여 올바르게 동작하는지 확인하는 방법입니다. PHP에서는 클래스나 메서드와 같은 작은 단위의 코드가 예상대로 작동하는지 확인하기 위해 유닛 테스트를 작성합니다. 이를 통해 코드의 정확성과 신뢰성을 보장할 수 있습니다.

왜 유닛 테스트를 작성해야 하는가?

- 코드의 신뢰성 확보: 유닛 테스트를 통해 코드가 예상대로 작동하는지 반복적으로 확인할 수 있습니다.
- 버그 예방: 테스트를 통해 코드 작성 시 발생할 수 있는 버그를 미리 발견하고 수정할 수 있습니다.
- 리팩토링 지원: 코드 리팩토링 시, 기존 기능이 손상되지 않도록 보호할 수 있습니다.
- 자동화된 테스트: CI/CD 파이프라인에 통합하여 지속적인 테스트와 검증이 가능합니다.


2. PHPUnit 설치 및 설정

Composer를 사용한 설치

PHPUnit은 PHP에서 가장 널리 사용되는 유닛 테스트 프레임워크입니다. PHPUnit을 설치하려면 Composer를 사용합니다:

composer require --dev phpunit/phpunit

이 명령어를 실행하면 'phpunit' 패키지가 'dev' 환경에 설치됩니다. 'vendor/bin/phpunit' 경로에서 PHPUnit을 실행할 수 있습니다.

phpunit.xml 설정 파일 작성

'phpunit.xml' 파일은 PHPUnit의 설정을 관리하는 파일로, 테스트를 실행할 때 필요한 설정을 정의할 수 있습니다. 프로젝트 루트에 'phpunit.xml' 파일을 생성하고 다음과 같이 설정할 수 있습니다:

<phpunit bootstrap="vendor/autoload.php" colors="true">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

이 설정은 'tests' 디렉터리 내의 모든 테스트 파일을 대상으로 테스트를 실행합니다. 'bootstrap' 옵션을 통해 자동으로 Composer의 autoloader를 로드합니다.


3. 기본 테스트 작성법

테스트 클래스 및 메서드 작성

PHPUnit에서 테스트는 클래스로 작성되며, 각 테스트 클래스는 'TestCase' 클래스를 확장해야 합니다. 각 테스트는 'test' 접두사가 붙은 메서드로 작성됩니다.

<?php

use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase
{
    public function testAddition()
    {
        $calculator = new Calculator();
        $result = $calculator->add(2, 3);
        $this->assertEquals(5, $result);
    }
}

?>

이 예제에서 'CalculatorTest' 클래스는 'Calculator' 클래스의 'add' 메서드를 테스트합니다. 'assertEquals' 메서드는 실제 값이 예상 값과 같은지 확인합니다.

주요 Assertion 메서드

PHPUnit은 다양한 Assertion 메서드를 제공하여 테스트를 작성할 수 있습니다. 다음은 자주 사용되는 Assertion 메서드입니다:

- 'assertEquals($expected, $actual)': 예상 값과 실제 값이 같은지 확인합니다.
- 'assertTrue($condition)': 조건이 'true'인지 확인합니다.
- 'assertFalse($condition)': 조건이 'false'인지 확인합니다.
- 'assertNull($variable)': 변수가 'null'인지 확인합니다.
- 'assertCount($expectedCount, $array)': 배열의 요소 수가 예상 값과 같은지 확인합니다.
- 'assertInstanceOf($expectedClass, $object)': 객체가 예상된 클래스의 인스턴스인지 확인합니다.


4. 테스트 실행 및 결과 확인

테스트 실행

테스트를 실행하려면 'vendor/bin/phpunit' 명령어를 사용합니다:

vendor/bin/phpunit

이 명령어를 실행하면 'tests' 디렉터리 내의 모든 테스트가 실행되고, 결과가 출력됩니다. 'phpunit.xml' 파일이 있는 경우, 해당 설정에 따라 테스트가 실행됩니다.

결과 분석 및 오류 수정

테스트 결과는 성공한 테스트와 실패한 테스트의 수를 보여줍니다. 실패한 테스트가 있는 경우, PHPUnit은 어떤 테스트가 실패했는지, 실패한 이유와 예상 값, 실제 값을 자세히 출력합니다.

예를 들어, 다음과 같은 출력이 있을 수 있습니다:

PHPUnit 9.5.0 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 00:00.012, Memory: 6.00 MB

There was 1 failure:

1) CalculatorTest::testAddition
Failed asserting that 4 matches expected 5.

/path/to/project/tests/CalculatorTest.php:10

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

이 출력은 'CalculatorTest::testAddition' 테스트가 실패했으며, 예상 값 5와 실제 값 4가 일치하지 않는다는 것을 보여줍니다. 이를 바탕으로 코드를 수정하고 다시 테스트할 수 있습니다.


5. 코드 예제

다음은 PHPUnit을 사용하여 기본적인 유닛 테스트를 작성하고 실행하는 예제입니다.

1. Calculator 클래스 작성 ('src/Calculator.php'):

<?php

class Calculator
{
    public function add($a, $b)
    {
        return $a + $b;
    }

    public function subtract($a, $b)
    {
        return $a - $b;
    }
}

?>

2. 테스트 클래스 작성 ('tests/CalculatorTest.php'):

<?php

use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase
{
    public function testAddition()
    {
        $calculator = new Calculator();
        $result = $calculator->add(2, 3);
        $this->assertEquals(5, $result);
    }

    public function testSubtraction()
    {
        $calculator = new Calculator();
        $result = $calculator->subtract(5, 3);
        $this->assertEquals(2, $result);
    }
}

?>

3. 테스트 실행:

vendor/bin/phpunit

코드 분석:
- 'Calculator' 클래스는 간단한 계산 기능을 제공합니다.
- 'CalculatorTest' 클래스는 'add'와 'subtract' 메서드에 대한 테스트를 정의합니다.
- 'assertEquals' 메서드를 사용하여 메서드가 예상대로 작동하는지 확인합니다.
- PHPUnit을 통해 테스트를 실행하고, 테스트가 성공적으로 완료되는지 확인합니다.


6. 결론 및 추가 학습 자료

이번 글에서는 PHPUnit을 사용하여 PHP 유닛 테스트를 작성하고 실행하는 방법에 대해 알아보았습니다. 유닛 테스트는 코드의 품질을 높이고, 오류를 사전에 방지할 수 있는 중요한 도구입니다. PHPUnit을 사용하면 PHP 프로젝트에서 쉽게 유닛 테스트를 작성하고 관리할 수 있습니다.

추가 학습 자료:
- [PHPUnit 공식 문서](https://phpunit.de/documentation.html) PHPUnit의 모든 기능과 사용법을 자세히 설명하는 공식 문서입니다.
- [Test-Driven Development with PHPUnit](https://www.thisprogrammingthing.com/2021/Test-driven-development-with-PHPUnit/) PHPUnit을 사용한 테스트 주도 개발(TDD)에 대한 가이드입니다.
- [Laracasts PHPUnit 강좌](https://laracasts.com/series/phpunit-testing-in-laravel) PHPUnit을 사용하여 Laravel 애플리케이션을 테스트하는 방법을 다루는 강좌입니다.


이제 PHPUnit을 사용하여 PHP 애플리케이션의 테스트를 작성하고, 코드의 신뢰성을 높일 수 있습니다. 지속적인 학습과 실습을 통해 테스트 주도 개발(TDD) 방법론을 익히고 적용해보세요!

반응형