웹 서비스 개발 – API 개발 기초 – 0 – API 개념과 REST 아키텍처

웹 서비스 개발 - API 개발 기초 - 0 - API 개념과 REST 아키텍처
웹 서비스 개발 – API 개발 기초 – 0 – API 개념과 REST 아키텍처

PHP 프레임워크 – CodeIgniter – 유닛 테스트

안녕하세요~ 😊
오늘은 개발자라면 반드시 익혀야 할 필수 스킬!
바로 **유닛 테스트(Unit Testing)**에 대해 알아보겠습니다.

“테스트 없이 개발하는 건 낙하산 없이 스카이다이빙 하는 것과 같다!”
라는 말, 들어보신 적 있으신가요?

유닛 테스트는 내가 작성한 코드가 정확하게 동작하는지 자동으로 확인해주는 안전망이에요.
코드이그나이터(CodeIgniter)에서는 phpunit과 잘 연동되어 있어서
테스트도 아주 간편하게 작성할 수 있답니다.


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

**유닛(Unit)**은 프로그램에서 가장 작은 단위, 즉 함수나 메서드를 의미합니다.
그리고 유닛 테스트는 이 작은 단위들이 의도한 대로 정확히 동작하는지 검증하는 테스트입니다.

비유하자면,

자동차의 전체 작동 여부를 보기 전에 엔진, 브레이크, 핸들 등 부품 하나하나가 잘 작동하는지 점검하는 과정이에요! 🧪


2. CodeIgniter에서 테스트 구성

CodeIgniter 4는 PHPUnit을 기반으로 테스트 프레임워크가 내장되어 있습니다.

테스트 디렉터리 구조

/app
/tests
  └── unit/
  └── feature/
  • tests/unit : 개별 클래스/함수 테스트
  • tests/feature : 컨트롤러, 라우팅 등 실제 HTTP 요청 테스트

3. PHPUnit 설치 확인

CodeIgniter 4는 vendor/bin/phpunit으로 이미 설치되어 있어요.

php vendor/bin/phpunit --version

phpunit 명령이 안 된다면 composer install 먼저 실행해주세요.


4. 유닛 테스트 클래스 만들기

php spark make:test MathTest --unit
// tests/Unit/MathTest.php
namespace Tests\Unit;

use CodeIgniter\Test\CIUnitTestCase;

class MathTest extends CIUnitTestCase
{
    public function testSum()
    {
        $this->assertEquals(4, 2 + 2);
    }

    public function testSubtraction()
    {
        $this->assertEquals(2, 5 - 3);
    }
}
  • CIUnitTestCase를 상속받아 테스트 클래스를 생성합니다.
  • assertEquals(예상값, 실제값)으로 결과 비교를 합니다.

5. 테스트 실행하기

php vendor/bin/phpunit

성공 시 출력 예시:

OK (2 tests, 2 assertions)

빨간 글자 나오면 실패! 초록 글자는 통과입니다! 🎉


6. 실제 모델 테스트 예제

// tests/Unit/UserModelTest.php
namespace Tests\Unit;

use CodeIgniter\Test\CIUnitTestCase;
use App\Models\UserModel;

class UserModelTest extends CIUnitTestCase
{
    public function testInsertUser()
    {
        $model = new UserModel();

        $data = [
            'username' => 'tester',
            'email' => 'tester@example.com',
            'password' => password_hash('123456', PASSWORD_DEFAULT)
        ];

        $model->insert($data);

        $user = $model->where('username', 'tester')->first();

        $this->assertEquals('tester@example.com', $user['email']);
    }
}

DB에 연결된 테스트는 트랜잭션을 통해 롤백되어 원본 데이터가 유지됩니다!


7. HTTP Feature 테스트 예제

php spark make:test ProductApiTest --feature
// tests/Feature/ProductApiTest.php
namespace Tests\Feature;

use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Test\CIUnitTestCase;

class ProductApiTest extends CIUnitTestCase
{
    use FeatureTestTrait;

    public function testGetProducts()
    {
        $result = $this->call('get', '/api/products');

        $result->assertStatus(200);
        $result->assertHeader('Content-Type', 'application/json');
    }
}
  • 실제 HTTP 요청을 보내 API 테스트까지 할 수 있어요!

8. 테스트 도우미 함수 예시

메서드 설명
assertEquals() 예상값과 실제값 비교
assertTrue() 값이 true인지 확인
assertFalse() 값이 false인지 확인
assertNull() 값이 null인지 확인
assertCount(n, array) 배열 요소 수 확인
assertStringContainsString('abc', $text) 문자열 포함 여부 확인

9. 데이터베이스 롤백 기능

CIUnitTestCase는 테스트 후 자동으로 트랜잭션 롤백을 해줍니다.

protected $refresh = true;
protected $seed = 'TestSeeder';
  • refresh가 true이면 테스트 후 DB 롤백
  • seed를 지정하면 초기화 데이터도 자동 삽입 가능

10. 테스트 커버리지 측정

테스트의 충실도를 확인하려면 커버리지를 측정하세요.

php vendor/bin/phpunit --coverage-html coverage
  • coverage/index.html 에서 시각화된 결과를 볼 수 있어요!
  • 어떤 코드가 테스트되었는지 한눈에 파악 가능 👀

주의사항 및 체크리스트 ✅

항목 주의할 점
테스트 격리 테스트 간 의존성 없이 독립적으로 작성할 것
DB 테스트 refresh 설정으로 실제 데이터 훼손 방지
assert 사용 검증 포인트가 명확해야 함
테스트 커버리지 코드 전체에 테스트가 퍼져 있는지 확인
테스트 자동화 GitHub Actions, GitLab CI 등과 연계 가능

마무리하며 😊

유닛 테스트는 개발자가 작성한 코드에 자신감을 부여하는 도구입니다.
코드가 많아질수록, 기능이 복잡해질수록 테스트의 중요성은 더 커지죠!

CodeIgniter는 PHPUnit, FeatureTestTrait, CIUnitTestCase
강력한 테스트 환경을 기본으로 제공하니,
이 기회에 꼭 연습해보고 실무에 적용해보세요!

다음 시간에는 PHP와 CodeIgniter 기반의 CI/CD 자동 배포도 살짝 소개해드릴게요.
그럼 오늘도 신뢰할 수 있는 코드를 위해, 테스트와 함께 화이팅입니다~! 💪💻🚀

답글 남기기