백엔드/테스트 코드 작성

[PHPUnit] PHP 단위 테스트 프레임워크 완벽 가이드

알쓸신개 2024. 12. 24. 09:27

1. 개요

PHPUnit은 PHP 개발에서 가장 널리 사용되는 테스트 자동화 프레임워크로, 단위 테스트(Unit Testing)와 기능 테스트(Functional Testing)를 통해 코드의 안정성과 신뢰성을 높이는 데 큰 도움을 줍니다. 이 글에서는 PHPUnit의 기본 개념부터 설치, 사용법, 주요 기능을 상세히 살펴보겠습니다.


2. PHPUnit이란?

PHPUnit은 PHP 코드를 테스트하고 검증할 수 있는 테스트 프레임워크입니다. 이 프레임워크는 xUnit 계열의 프레임워크로, Java의 JUnit 등과 비슷한 방식으로 동작합니다.

PHPUnit의 주요 기능

  • 단위 테스트: 코드의 작은 단위(클래스, 메서드 등)를 독립적으로 테스트.
  • Assertions(단언문): 테스트 결과를 확인하는 다양한 검증 메서드 제공.
  • Mocking(모의 객체): 외부 종속성을 제거하고 독립적으로 테스트.
  • 코드 커버리지: 테스트가 전체 코드의 몇 퍼센트를 커버하는지 보고서 생성.
  • 데이터 공급자(Data Provider): 동일한 테스트를 여러 데이터 세트로 반복 실행.
  • 테스트 그룹화: 특정 테스트 그룹을 실행하거나 제외.

3. PHPUnit 설치하기

PHPUnit은 Composer를 통해 쉽게 설치할 수 있습니다.

3-1. Composer로 설치

composer require --dev phpunit/phpunit

3-2. 설치 확인

설치 후 PHPUnit의 버전을 확인합니다.

./vendor/bin/phpunit --version

4. PHPUnit 기본 사용법

4-1. 테스트 클래스 작성

PHPUnit을 사용하려면 PHPUnit\Framework\TestCase를 상속받아 테스트 클래스를 작성합니다.

<?php

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    public function testAddition()
    {
        $this->assertEquals(4, 2 + 2);
    }
}

4-2. 테스트 실행

테스트를 실행하려면 터미널에서 아래 명령어를 입력합니다.

./vendor/bin/phpunit

실행 결과는 다음과 같이 표시됩니다:

OK (1 test, 1 assertion)

5. PHPUnit의 주요 단언문(Assertions)

테스트 결과를 검증하기 위해 다양한 단언문을 제공합니다.

메서드 설명
assertEquals($a, $b) $a$b가 같은지 확인
assertTrue($condition) 조건이 true인지 확인
assertFalse($condition) 조건이 false인지 확인
assertNull($value) 값이 null인지 확인
assertArrayHasKey($key, $array) 배열에 특정 키가 있는지 확인
assertCount($count, $array) 배열의 요소 개수가 맞는지 확인

6. Mock 객체(Mock Object) 사용

Mock 객체를 사용하면 외부 의존성을 제거하고 독립적으로 테스트할 수 있습니다. 이를 통해 데이터베이스, API 등 실제 환경에 의존하지 않고 테스트를 수행할 수 있습니다.

Mock 객체 예제

<?php

use PHPUnit\Framework\TestCase;

class UserServiceTest extends TestCase
{
    public function testGetUserName()
    {
        $user = $this->createMock(User::class);
        $user->method('getName')->willReturn('John Doe');

        $this->assertEquals('John Doe', $user->getName());
    }
}

7. 데이터 공급자(Data Provider)

데이터 공급자를 사용하면 동일한 테스트를 다양한 데이터 세트로 반복 실행할 수 있습니다.

데이터 공급자 예제

<?php

use PHPUnit\Framework\TestCase;

class MathTest extends TestCase
{
    /**
     * @dataProvider additionProvider
     */
    public function testAddition($a, $b, $expected)
    {
        $this->assertEquals($expected, $a + $b);
    }

    public function additionProvider()
    {
        return [
            [1, 1, 2],
            [2, 2, 4],
            [3, 3, 6],
        ];
    }
}

8. PHPUnit과 Laravel

Laravel은 PHPUnit을 기본적으로 지원하며, Laravel 프로젝트에서 테스트 파일은 tests 디렉토리에 작성합니다.

8-1. 테스트 생성

php artisan make:test ExampleTest

8-2. HTTP 테스트 예제

<?php

use Tests\TestCase;

class ExampleTest extends TestCase
{
    public function testHomePage()
    {
        $response = $this->get('/');
        $response->assertStatus(200);
    }
}

8-3. 테스트 실행

php artisan test

9. PHPUnit을 사용하는 이유

  1. 코드 안정성 보장: 리팩토링이나 기능 추가 시 기존 코드의 안정성을 유지.
  2. 버그 예방: 코드 작성 시 버그를 사전에 발견.
  3. 효율성: 반복적인 수작업 테스트를 자동화.
  4. 협업 강화: 다른 개발자가 코드 변경 시 테스트로 기존 기능이 깨지는지 확인.

10. 결론

PHPUnit은 PHP 개발에 있어 필수적인 도구로, 코드 품질을 높이고 안정성을 유지하는 데 중요한 역할을 합니다. 특히, 신입 개발자부터 숙련된 개발자까지 모두에게 효율적인 테스트 환경을 제공합니다.

지금 바로 PHPUnit을 설치하고, 테스트 코드를 작성하며 더 안정적이고 신뢰할 수 있는 코드를 만들어 보세요!