
PHP 프레임워크 – Laravel – 유닛 테스트
안녕하세요, 여러분~ 😄
오늘은 웹 개발에서 성능과 안정성을 동시에 보장해주는 아주 중요한 주제,
바로 Laravel에서의 **유닛 테스트(Unit Testing)**에 대해 함께 알아볼 거예요!
Laravel은 테스트를 위한 도구를 아주 탄탄하게 지원하고 있어서,
복잡한 시스템도 자동으로 검증하면서 개발을 진행할 수 있답니다!
특히, 변경이 자주 일어나는 서비스일수록 테스트는 필수예요! 🧪🔍
유닛 테스트란 무엇인가요?
💡 비유하자면?
유닛 테스트는 마치 자동차 조립 전에 엔진, 브레이크, 핸들 하나하나를
개별적으로 테스트해보는 것과 같아요.
전체가 잘 작동하기 위해서는, 각 부품이 문제 없이 움직여야 하거든요! 🚗🔧
Laravel의 테스트 환경
Laravel은 기본적으로 PHPUnit을 기반으로 테스트 기능을 제공합니다.
📂 디렉터리 구조
tests/
├── Feature/ ← 전체 기능 테스트
└── Unit/ ← 개별 로직, 함수, 클래스 테스트
phpunit.xml
파일은 테스트 설정 파일이에요.
테스트 환경 설정(.env.testing
)도 따로 존재할 수 있어요!
1. 유닛 테스트 생성하기
우선 테스트 파일을 생성해볼게요!
php artisan make:test UserTest --unit
--unit
옵션을 주면tests/Unit
폴더에 생성됩니다.
2. 간단한 유닛 테스트 작성
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class UserTest extends TestCase
{
public function test_basic_math()
{
$this->assertEquals(2, 1 + 1);
}
}
assertEquals(예상값, 실제값)
은 기본적인 테스트 메서드예요.php artisan test
또는vendor/bin/phpunit
명령으로 테스트를 실행합니다.
3. Laravel 애플리케이션 테스트하기
Laravel의 기능을 제대로 테스트하려면
Tests\TestCase
를 상속받은 테스트 클래스를 사용해야 해요.
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_user_name()
{
$user = new User(['name' => '홍길동']);
$this->assertEquals('홍길동', $user->name);
}
}
4. Feature 테스트 vs Unit 테스트
종류 | 목적 | 예시 |
---|---|---|
Unit Test | 클래스, 메서드 단위로 테스트 | User::isAdmin() 리턴값 확인 |
Feature Test | 전체 요청 흐름 테스트 | 로그인 요청 후 리디렉션 확인 |
5. HTTP 요청 테스트 (Feature 테스트)
php artisan make:test LoginTest
public function test_login_page_shows_correctly()
{
$response = $this->get('/login');
$response->assertStatus(200);
$response->assertSee('로그인');
}
✅ POST 요청 테스트 예시
public function test_login_success()
{
$user = User::factory()->create([
'email' => 'test@example.com',
'password' => bcrypt('password'),
]);
$response = $this->post('/login', [
'email' => 'test@example.com',
'password' => 'password',
]);
$response->assertRedirect('/home');
$this->assertAuthenticatedAs($user);
}
6. 테스트 데이터베이스 설정
.env.testing
파일을 따로 만들어주세요.
DB_CONNECTION=sqlite
DB_DATABASE=:memory:
- 인메모리 SQLite는 빠르고, 테스트용으로 아주 적합해요.
- 테스트 실행 시, 실제 DB와 격리되어 안전하게 테스트할 수 있어요!
7. 팩토리로 테스트 데이터 만들기
Laravel은 Model Factory
를 통해 더 쉽고 빠르게 데이터를 생성할 수 있어요.
php artisan make:factory PostFactory --model=Post
public function definition()
{
return [
'title' => $this->faker->sentence,
'content' => $this->faker->paragraph,
];
}
테스트 코드에서 사용:
$post = Post::factory()->create();
또는 여러 개:
$posts = Post::factory()->count(5)->create();
8. 시더/마이그레이션 자동 적용
테스트 실행 전에 DB 초기화하고 마이그레이션하는 코드:
use Illuminate\Foundation\Testing\RefreshDatabase;
class PostTest extends TestCase
{
use RefreshDatabase;
public function test_post_created()
{
$post = Post::factory()->create();
$this->assertDatabaseHas('posts', ['title' => $post->title]);
}
}
9. 다양한 Assertion 메서드
메서드 | 설명 |
---|---|
assertEquals() |
두 값이 같은지 확인 |
assertTrue() |
값이 참인지 확인 |
assertFalse() |
값이 거짓인지 확인 |
assertNull() |
값이 null인지 확인 |
assertCount() |
배열/컬렉션의 갯수 확인 |
assertDatabaseHas() |
DB에 레코드 존재 확인 |
assertRedirect() |
리디렉션 응답 확인 |
assertSee() |
HTML 응답에 텍스트 존재 여부 확인 |
10. 테스트 자동화 꿀팁
- 테스트 실행 전
.env.testing
에서 캐시/큐 설정도 별도로 설정하세요. - GitHub Actions 같은 CI 도구에 테스트 자동화 설정도 가능해요!
- 테스트 커버리지를 측정하고 싶은 분은
pest
,coverage
,xdebug
등을 활용해보세요.
주의할 점 ✅
항목 | 설명 |
---|---|
실DB 사용 금지 | 테스트는 반드시 별도의 DB를 사용해야 안전 |
DB 정리 | RefreshDatabase 또는 DatabaseTransactions 사용 |
CSRF 주의 | POST 요청 시 토큰 필요 (테스트는 자동 처리됨) |
테스트 간 간섭 방지 | 독립적인 테스트 구조 유지 필수 |
의존성 낮추기 | 비즈니스 로직을 서비스로 분리해서 테스트하기 쉽게 설계 |
요약 정리 🎯
항목 | 설명 |
---|---|
테스트 명령어 | php artisan test 또는 vendor/bin/phpunit |
테스트 종류 | Unit (단위), Feature (요청 흐름) |
DB 테스트 | SQLite 인메모리, RefreshDatabase 사용 |
팩토리 | factory() 로 테스트 데이터 생성 |
검증 방법 | assertEquals , assertStatus , assertSee , assertDatabaseHas 등 |
마무리하며 😊
Laravel의 유닛 테스트는 단순히 코드를 검증하는 데 그치지 않아요!
변경에도 강한 견고한 시스템을 만들기 위한 가장 믿음직한 친구랍니다! 🧪✨
처음에는 어렵게 느껴질 수 있지만, 한 번 익숙해지면
디버깅 시간도 줄고, 자신감 있게 리팩토링도 할 수 있게 돼요!
다음 시간에는 큐 시스템과 비동기 처리에 대해 함께 공부해볼게요.
그럼 오늘도 테스트로 더 탄탄한 Laravel 개발 되시길 바랄게요~ 💻🎯💪