라라벨 시프트와 테스트 제너레이터 사용기 2편 free

2019-08-20

어제 저녁에 벨 시프트에서 답장이 와서 벨 5.8로 업데이트도 하고 테스트 제너레이터도 정상적으로 실행했습니다. 테스트 제너레이터 서비스를 이용하기 전에 phpunit을 실행해보니 아래와 같이 나옵니다.


스크린샷 2019-08-20 오후 5.03.00.png


ExampleTest는 벨 설치하면 원래 있는 것들이니 의미 없고, ReservationTest와 SmsTest는 파을 제가 만들었었네요. 테스트를 하나도 작성하지 않은 줄 알았는데 나름 중요한 로직은 테스트를 작성했었군요! (살짝 대견한 ^^)


다음은 테스트 제너레이터 서비스를 이용해서 테스트를 생성한 후 phpunit를 실행한 결과입니다.


스크린샷 2019-08-20 오후 4.53.46.png


테스트가 4개에서 50개로 늘고, 완성되지 않은 테스트가 46개 늘었네요.


이쯤에서 테스트 제너레이터가 어떤걸 해주기로 했었는지 다시 한 번 되짚어봅시다.



  • 기본 벨 테스팅 파이 최신 버전인지 검증한다.

  • 모델 팩토리를 만들어준다.

  • HTTP 테스트를 만든다.

  • 콘솔 테스트를 만든다.

  • 폼 리퀘스트에 대한 확인을 추가한다.

  • 테스팅 환경을 설정한다.

  • 유용한 테스팅 패키지를 설치한다.


기본 벨 테스팅 파이 최신 버전인지 검증한다


스크린샷 2019-08-20 오후 5.52.58.png


이런으로 알려줍니다. 제 경우는 사용 중인 벨 버전에 해당하는 기본 파과 달서 검증할 수 없다고 나오는 정도였습니다. 제대로 검증하면 어떻게 나오는지 궁금하네요.


모델 팩토리를 만들어준다


스크린샷 2019-08-20 오후 5.57.45.png


3개의 모델 팩토리를 만들어줬습니다. 제가 사용하는 모델은 총 8개인데, 5개는 제가 이미 만들어놨었기 때문인가봅니다. 이미 있는 건 건드리지 않고 없는 것만 만들어주는 것 같네요. 합리적으로 보입니다.


생성해준 팩토리는 손을 더 보지 않고 바로 쓸 수 있는 것도 있고, 조금 손을 봐야하는 것도 있습니다. 뭐 이정도면 훌륭한 것 같습니다.


HTTP 테스트를 만든다


아래에서 보듯이 tests/Feature/Http/Controllers 디렉터리에 컨트롤러별로 파을 만들어줍니다.


스크린샷 2019-08-20 오후 5.26.52.png


아래와 같은 테스트를 자동으로 만들어줍니다.


/**
* @test
*/
public function create_returns_an_ok_response()
{
$this->markTestIncomplete('This test case was generated by Shift. When you are ready, remove this line and complete this test case.');

$user = factory(\App\User::class)->create();

$response = $this->actingAs($user)->get(route('branches.create'));

$response->assertOk();

// TODO: perform additional assertions
}

앞서 완성되지 않은 테스트가 46개 만들어졌다고 했는데, 테스트 내에서 $this->markTestIncomplete() 매서드를 호출하면 완성되지 않은(Incomplete) 테스트로 인됩니다.


만들어지는 대부분의 테스트는 위에서 보는 것 같이 정상적인 응답이 나오는지 확인하는 정도의 간단한 테스트 코드입니다. POST, UPDATE 리퀘스트에 대한 테스트는 대부분은 추가적으로 손을 대야 의미있는 결과를 얻을 수 있으므로 실망스러우실 수도 있을 것 같습니다. 하지만 실제 프로젝트에서는 모든 GET 우트의 호출 결과가 정상으로 나오는지(응답 HTTP 코드 200)에 대한 테스트를 가지고 있는 것만으로도 상당히 도움이 됩니다. 제 직전 프로젝트에서 사장님이 가장 먼저 요구한 것도 ‘모든 GET 우트가 깨지지 않았는지 확인’하는 테스트였어요. 기존 프로젝트에 새로 테스트를 시작해야한다면 이것만으로도 꽤 도움이 될거 생각이 듭니다.


시프트는 우트를 기준으로 테스트를 만들어 줌


제 프로젝트에서 BranchController는 index() 매서드 하나만을 가지고 있습니다. 그런데, 시프트가 만들어준 BranchControllerTest는 index index_returns_an_ok_response 뿐만 아니 create, store, delete 등 총 7개의 테스트를 만들어주었더군요. 이유를 살펴보니 제가 우트를 정의할 때 Route::resource('/branches', 'BranchController'); 으로 리소스 우트로 정의했기 때문이었습니다. 귀찮아서 우트는 리소스 우트로 정의해놓고 컨트롤러에는 필요한 매서드만 정의해서 사용했는데, 이런 경우에는 오히려 시프트가 만들어준 테스트를 지워야하는 귀찮음이 발생하네요.


콘솔 테스트를 만들어 준다


스크린샷 2019-08-20 오후 6.10.09.png


tests/Unit/Console/Commands 디렉터리에 콘솔 커맨드별로 테스트를 만들어줍니다. 당연하게도 시프트는 틀만 만들어주는 정도에 그치고, 구체적인 테스트는 직접 작성해야합니다.


폼 리퀘스트에 대한 확인을 추가한다


이 애플리케이션에서는 폼 리퀘스트를 안써서 체험을 할 수가 없었습니다. ㅠ 개인적으로는 이게 엄청 유용했을 것 같은데 아쉽습니다. 유효성 검사를 통과하는지 못하는지 상황을 하나하나 만들어서 추가하는게 꽤 귀찮거든요.


테스팅 환경을 설정한다


제 경우에는 phpunit.xml 파을 조금 수정해줬습니다.


유용한 테스팅 패키지를 설치한다


아래의 세 패키지를 설치합니다.



  • beyondcode/laravel-dump-server

  • jasonmccreary/laravel-test-assertions

  • mpociot/laravel-test-factory-helper


마치며


어느 정도는 실망스럽고, 어느 정도는 만족스러운 서비스입니다. 프로젝트 규모가 어느 정도 된다면 가성비가 엄청 좋다고 봅니다. 15달러에 모든 컨트롤러와 커맨드에 대한 테스트를 스캐폴딩하고, 전체 모델의 모델 팩토리를 만들어주는데, 아무리 간단한 코드고 해도 시급 1만원 주는 알바에게 2시간 시켜도 테스트 제너레이터가 만들어주는 코드의 1/10도 작성하지 못할 가능성이 높습니다.


여담입니다만 기술 기반의 SaaS 정말 멋지네요! 리스펙!!


1 1 벨 36호
2019년 8월 20



이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.