
① 한 문단에 한 주제
② 완벽하게 제어하기
③ 테스트 환경의 독립성을 보장하자.
④ 테스트 간 독립성을 보장하자.
⑤ 한 눈에 들어오는 Test Fixture 구성하기
⑥ Test Fixture 클렌징
⑦ 테스트 수행도 비용이다. 환경 통합하기
⑧ private 메서드의 테스트
⑨ 테스트에서 필요한 메서드가 생겼는데 프로덕션 코드에서는 필요 없는 경우
⑤ 한 눈에 들어오는 Test Fixture 구성하기
Test Fixturegiven 절에서 생성하는 객체들을 의미한다.given 절을 구성할 때 생성하는 모든 객체들을 의미한다고 생각하자.Test Fixture 를 구성할 때의 4가지 주의사항Test Fixture 를 구성하는 것(Setup)을 지양하자. ( 최대한 given 절에 명시해서, 단일 테스트 코드 내에서 모든 것들을 표현하자. )given 절의 데이터가 겹치는 경우는 빈번히 발생한다. 그래서 보통 @BeforeEach 등을 사용해서 공통의 Test Fixture 들을 정의하는데, 그렇게 되면 테스트간 결합도가 생기게 될 수 있다. 따라서 Test Fixture 들을 수정하거나 하는 경우, 다른 테스트에 영향을 줄 수 있으므로 사용을 지양하는게 좋다.@BeforeEach 등을 사용해서 Test Fixture 들을 정의하게 되면, 테스트에서 사용하는 Test Fixture 가 테스트 내부에 정의되어 있지 않고 파편화되어 있다보니, 문서로서의 테스트 역할을 하기가 어려워진다.@BeforeEach 등을 언제 사용할까?@BeforeEach 등 Setup 절에서 생성할 수 있다.given 절이 길어지더라도, given 절에 명시하는 것이 좋다. ( 문서로서의 테스트를 염두하자. )@BeforeAll: 테스트 클래스 전체 실행 전에 무언가 작업을 하도록 적용@BeforeEach: 매 테스트 메서드 실행 전에 무언가 작업을 하도록 적용@AfterAll: 테스트 클래스 전체가 끝나고 나서 무언가 작업을 하도록 적용@AfterEach: 매 테스트 메서드 실행 이후에 무언가 작업을 하도록 적용given 절의 대상이 되는 데이터를 data.sql 등을 사용해서 미리 Setup 해서 생성해두는 것을 지양하자. ( given 데이터를 트래킹하기가 어려움 )given 절의 Test Fixture 가 data.sql 에서 파편화되어 관리되는 것이다. 따라서 무엇을 테스트하는지를 파악하는 것이 어려워질 수 있다.data.sql 의 쿼리가 점차 많아질 것이다. 그러면, 점점 이 data.sql 자체에 대한 관리 포인트도 늘어나게 된다. (유지보수 포인트가 되기도 한다.)given 절에서 Test Fixture 를 구성할 때, builder 나 생성자를 사용해서 생성하는 경우, 코드가 길어지니까 테스트 클래스 내에서 메서드로 분리하고 호출해서 생성하는 경우가 많이 있다. 이때, 메서드 파라미터에는 테스트에서 꼭 필요한 필드 정보로만 전달되도록 하는 게 좋다. ( 테스트와 상관없는 것들은 메서드 내부에서 아무런 값으로 세팅하자. )given 절에서 필요한 Test Fixture 가 공통되는 부분이 많은 경우, 그런 부분을 공통적으로 호출해서 생성하기 위해, 별도의 추상 클래스 등을 만들어서 builder 를 한 데 모아 구성해서 사용하는 것은, 오히려 먼 미래에 관리 포인트와 복잡도가 늘어나고, side effect 가 발생할 수 있다. (지양하자.)
⑥ Test Fixture 클렌징
트랜잭션 롤백 방식deleteAllInBatch() / deleteAll()deleteAllInBatch()delete from tableNamedeleteAll()select * from tableNamedelete from tableName where id = ?deleteAllInBatch 보다는 시간적으로 비용이 소요된다.@Transactional)을 주로 사용하되, 그 외 수동으로 클렌징 해야 하는 경우는, deleteAll 보다는 deleteAllInBatch 를 사용하는 편이 낫다.
✔️ 정리
Test FixtureGiven 절에 테스트 환경을 조성할 때, 테스트와 직접적인 관련이 있는것과 없는것이 있을때, 없는 것은 Setup() 절에서 구성하면 좋다.Setup() 절에서 무분별하게 전부 구성하면, (마치 공유변수를 쓰는 것 과 같은) 테스트가 결합도가 생길 수 있다.data.sql 과 같이 파일로 관리하는 것도, 문서로서 테스트를 읽는데 방해가 되기 때문에 지양하자. (파편화)Test Fixture 클렌징@Transactional 자동 롤백을 사용하자.@Transactional 이 안걸려있더라도, 테스트에서 걸려있기 때문에, 프로덕션 코드 작성시 주의해야 한다.@Transactional 로 처리하기 어려운 경우 수동으로 해야할 때가 있다. 그런 경우 deleteAll() , deleteAllInBatch() 를 사용하자.deleteAll() 보다는 deleteAllInBatch() 를 사용하는 편이 비용면에서 더 낫다.강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 박우빈 강사님께 있습니다.