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

PHP 프레임워크 - Laravel - 9 - 유닛 테스트
PHP 프레임워크 – Laravel – 9 – 유닛 테스트

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 개발 되시길 바랄게요~ 💻🎯💪

답글 남기기