
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 자동 배포도 살짝 소개해드릴게요.
그럼 오늘도 신뢰할 수 있는 코드를 위해, 테스트와 함께 화이팅입니다~! 💪💻🚀