소개
Laravel에는 데이터베이스를 사용하는 기능을 안전하고 빠르게 검증하기 위한 구조가 기본으로 제공됩니다. 데이터베이스 리셋용 트레이트, 모델 팩토리, 시더, 전용 어서션을 조합하면 잘 부러지지 않는 테스트를 작성할 수 있습니다. 먼저RefreshDatabase를 사용하는 것이 기본입니다. 대부분의 경우 완전 리셋보다 빠르게 테스트의 독립성을 유지할 수 있습니다.
각 테스트 후 데이터베이스 리셋
이전 테스트 데이터가 다음 테스트에 영향을 주지 않도록 Laravel의 데이터베이스 리셋용 트레이트를 이용합니다.RefreshDatabase는 스키마가 최신인지를 판정합니다. 최신이면 트랜잭션으로 테스트를 실행하고, 최신이 아니면 먼저 마이그레이션을 실행합니다.
트랜잭션 방식이 아니라, 매번 완전히 리셋하고 싶은 경우에는 다음 트레이트를 사용합니다.
| 트레이트 | 동작 | 사용 상황 |
|---|---|---|
RefreshDatabase | 스키마가 최신이면 트랜잭션, 필요할 때만 마이그레이션 | 일반적으로 이것을 첫 번째 후보로 삼는다 |
DatabaseMigrations | 각 테스트마다 마이그레이션을 실행 | 매번 마이그레이션 라이프사이클을 거치고 싶은 경우 |
DatabaseTruncation | 테이블을 TRUNCATE해서 초기화 | 트랜잭션이 적합하지 않은 환경에서 전체 데이터를 지우고 싶은 경우 |
모델 팩토리
테스트 전에 데이터를 준비할 때 모델 팩토리를 사용하면 Eloquent 모델을 간결하게 생성할 수 있습니다. 팩토리 정의·state·관계의 자세한 내용은 Eloquent 팩토리를 참조해 주세요.시더 실행
테스트 중에 데이터를 투입하고 싶은 경우에는seed()를 사용합니다. 인수 없이 호출하면 DatabaseSeeder, 인수를 넣으면 특정 시더(또는 배열)를 실행할 수 있습니다.
RefreshDatabase를 사용하는 모든 테스트에서 매번 자동 시드하고 싶은 경우에는 기저 테스트 클래스에 #[Seed] 애트리뷰트를 붙입니다.
#[Seeder(...)]를 사용합니다.