테스트란
테스트란, 코드가 기대한 대로 동작하는지를 자동적으로 검증하는 구조입니다. 테스트를 작성함으로써, 기능 추가나 수정을 했을 때에 기존의 동작이 무너지지 않았는지를 신속하게 확인할 수 있습니다. 팀에서의 개발에서는, 테스트가 있음으로써 안심하고 코드를 변경·리뷰할 수 있습니다. Laravel은 처음부터 테스트의 지원이 포함되어 있어, Pest와 PHPUnit의 양쪽을 사용할 수 있습니다. 신규 설치 시에는phpunit.xml 설정 파일과 tests/ 디렉터리가 자동적으로 준비되어 있습니다.
tests/ 디렉터리의 구성
Feature/— 기능 테스트를 둡니다. HTTP 리퀘스트를 포함하는 큰 단위의 테스트에 사용합니다. 여러 오브젝트가 연계하는 동작이나 API 엔드포인트의 검증 등, 애플리케이션 전체에 가까운 테스트입니다. 대부분의 테스트는 여기에 두게 됩니다.Unit/— 유닛 테스트를 둡니다. 단일의 클래스나 메서드 등, 작은 단위의 테스트에 사용합니다. Laravel 애플리케이션은 기동하지 않기 때문에, 데이터베이스나 다른 프레임워크 기능은 사용할 수 없습니다.
테스트의 작성
make:test Artisan 명령으로 새로운 테스트 클래스를 생성합니다.
tests/Feature/TodoTest.php가 생성됩니다.
테스트의 실행
php artisan test 명령으로 테스트를 실행합니다.
vendor/bin/pest나 vendor/bin/phpunit을 직접 실행해도 같은 결과를 얻을 수 있지만, php artisan test 쪽이 보기 좋은 출력을 얻을 수 있기 때문에 추천합니다.
특정한 테스트 스위트만을 실행하고 싶을 때는 옵션을 사용합니다.
기본적인 테스트 작성 방법
심플한 어서션의 예입니다.자주 사용하는 어서션
HTTP 테스트
Laravel의 HTTP 테스트에서는, 실제의 HTTP 서버를 세우지 않고, 라우트에의 리퀘스트를 시뮬레이트할 수 있습니다.Feature/ 디렉터리의 테스트 클래스에서 사용할 수 있는 강력한 기능입니다.
페이지의 표시를 확인
get() 메서드로 GET 리퀘스트를 보내고, 응답을 검증합니다.
ToDo 앱의 HTTP 테스트 예
Todo 모델이 있는 애플리케이션을 예로, CRUD의 각 조작을 테스트합니다.
자주 사용하는 응답의 어서션
RefreshDatabase 트레이트를 사용하면, 각 테스트의 실행 후에 데이터베이스를 리셋합니다. 테스트 간에 데이터가 간섭하지 않도록 하기 위해 사용합니다.테스트 환경
phpunit.xml의 설정
프로젝트 루트의 phpunit.xml에서 테스트 환경의 설정을 수행합니다.
기본적으로 세션과 캐시가 array 드라이버로 설정되어 있어, 테스트 실행 중에 데이터가 남지 않습니다.
.env.testing 파일
프로젝트 루트에 .env.testing 파일을 작성하면, 테스트 실행 시에 .env 대신에 로드됩니다.
테스트 전용의 데이터베이스 접속이나 외부 서비스의 설정을 나누고 싶은 경우에 사용합니다.
병렬 테스트 실행
테스트 수가 늘어나면 실행 시간이 길어집니다.--parallel 옵션을 사용하면, 여러 프로세스에서 테스트를 동시 실행해 시간을 단축할 수 있습니다.
우선 brianium/paratest 패키지를 설치합니다.
--parallel 옵션을 붙여 실행합니다.
--processes 옵션을 사용합니다.
다음 단계
HTTP 테스트
리퀘스트의 시뮬레이션, 인증 첨부 테스트, JSON 어서션 등, 보다 자세한 HTTP 테스트의 방법을 확인할 수 있습니다.