이번 글을 쓰게된건 매번 기능(Feature) 테스트와 유닛(Unit) 테스트의 차이점을 확실히 하고,
개인적으로 쌓인 유닛 테스트에 대한 오해를 풀어 보려고 합니다.

Laravel 코드상의 차이점

Laravel 에선 다음과 같은 TEST 디렉토리 구조를 가집니다.

tests
  └ Feature
    └ ExampleTest.php
  └ Unit
    └ ExampleTest.php
  └ CreatesApplication.php
  └ TestCase.php

기능 테스트와 유닛 테스트를 나눠 놓았습니다.

두 테스트의 가장 큰 차이는 확장 하는 부모 클래스인데,
기능 테스트는 Tests\TestCase를 상속 받고,
유닛 테스트는 PHPUnit\Framework\TestCase의 테스트를 상속 받습니다.

이 두 TestCase의 차이는 Laravel의 bootstrap과정을 거치냐의 차이이고,
이 때문에 유닛 테스트의 TestCase는 Laravel의 helper, ORM 등을 사용할 수가 없습니다.

하지만 bootstrap과정이 없기 때문에 그만큼 테스트 속도가 빠르다는 장점도 있죠.

의미론적 차이점

기능 테스트

기능 테스트는 “종단간의 테스트” 즉, requestresponse의 테스트를 의미합니다.

즉, /post/1/edit에 글을 작성한 User만 들어갈 수 있다. 기능이 있고 이러한 기능을 테스트를 하는 경우에 기능 테스트를 만드는 것입니다.

유닛 테스트

유닛 테스트는 “단위 테스트” 라고 번역 되는 만큼 가장 작은 테스트를 의미합니다.

예를 들어, Postpassword가 설정 되어있을 때 isHasPassword() 값이 true 여야 하는 이런 작은 테스트 들을 말합니다.

마치며

저의 경우엔 코드상의 차이만으로 받아드리고, 저는 기능 테스트에는 Tests\TestCase를 상속받는 테스트가,
유닛 테스트에는 PHPUnit\Framework\TestCase를 상속받는 테스트가 들어야한다 라는 작은 오해(?)가 생겨 버렸습니다.

하지만 아시다 싶이 Laravel의 기능을 테스트한다는 것에서 Laravel의 helper 들을 안 쓸 수가 없습니다.

그러다보니 점점 기능 테스트 디렉터리만 커지다 보니 이게 맞나 싶어 찾아본 내용들을 정리해 보았습니다.

그리고 막상정리 하다보니 테스트를 가볍게 유지하면서 Laravel의 helper, orm등을 쓰는 방안들을 찾을 수 있었습니다. 이러한 부분도 나중에 살짝 다뤄 볼 수 있었음 좋겠습니다.