개발/도서 스터디
자바와 Junit을 활용한 실용주의 단위 테스트 4장
방푸린
2023. 7. 24. 22:11
반응형
4. 테스트 조직
4.1 테스트 코드를 작성할 때 AAA
Arrange: 테스트 코드 실행 전 준비; 객체 생성
Act:테스트 코드 실행
Assert: 실행한 코드가 기대한 대로 동작하는지 확인
After: 때에 따라 필요; 테스트 실행 시 어떤 자원을 할당했다면 clean up 필
=> 각 구분을 구별하기 위해 빈 줄을 삽입
- Given/When/Then
- Given
- 테스트를 위해 주어진 상태
- 테스트 대상에게 주어진 조건
- 테스트가 동작하기 위해 주어진 환경
- When
- 테스트 대상에게 가해진 어떠한 상태
- 테스트 대상에게 주어진 어떠한 조건
- 테스트 대상의 상태를 변경시키기 위한 환경
- Then
- 앞선 과정의 결과
- Given
4.2 단위 테스트를 작성할 때는 먼저 전체적인 시각에서 시작해야
개별 메서트를 테스트하긴 하는 것이 아니라
- 입금
- 출금
- 잔액확인
클래스의 종합적인 동작을 테스트 하는 관점에서 테스트를 작성해야함
- 입금 -> 잔액 확인 -> 출금 -> 잔액 확인 등의 흐름으로 클래스 전체를 테스트
4.3 테스트와 프로덕션 코드의 관계
테스트 코드와 프로덕션 코드는 분리되어야
1. 테스트를 프로덕션 코드와 같은 디렉터리/패키지에 넣기
-> x; 테스트코드를 따로 분리하기 어려움
2. 테스트를 별도 디렉터리로 분리하지만 프로덕션 코드와 같은 패키지에 넣기
-> 주로 채택; test의 디렉터리 구조가 src 디렉터리를 반영; 테스트 클래스는 패키지 수준의 접근 권한을 가짐
3. 테스트를 별도의 디렉터리와 유사한 패키지에 유지
-> 테스트 코드를 프로덕션 코드의 패키지와 다르게하면 public 인터페이스만 활용하여 테스트코드 작성하게 되미. 많은 개발자가 의도적으로 설계할 때 이 정책을 채택
4.3.2 내부 데이터 노출 vs 내부 동작 노출
- public method가 아닌 함수(비공개 코드; private method)를 호출하는 테스트는 구현 세부 사항과 결속이 심해져 테스트가 깨질 수 있음.
- 내부의 세부 사항을 테스트하는 것은 저품질로 이어짐
- ex. 코드의 작은 변화가 수많은 테스트를 깨면(과도하게 내부 구현 사항을 알고 있기에) -> 개발자는 당황 -> 테스트가 더 많이 깨질수록 개발자는 리팩토링이 꺼려짐 -> 코드의 퇴화
- 테스트를 위해 내부 데이터를 노출하는 것은 테스트와 프로덕션 코드 사이에 과도한 결합을 초래
- 테스트를 위해 getter 생성
- private method를 테스트하고 싶은 충동이 든다면.. 설계에 문제가 있는 것(클래스의 SRP위배)
- -> 의미있는 private method를 추출하여 별도의 클래스로 분리
4.4 집중적인 단일 목적 테스트의 가치
테스트는 주요 동작을 단위로 적당하게 나눠야
- 테스트가 실패할 경우 실패한 테스트 이름이 표시되기에 어느 동작에 문제가 있는지 파악 가능
- 실패한 테스트를 해독하는 시간을 줄일 수 있음
- 테스트가 실패할 경우 테스트가 중지되기 때문에 모든 케이스가 실행됨을 보장가능
4.5 문서로서의 테스트
4.5.1 일관성 있는 이름으로 테스트를 문서화
- 어떤 맥락에서 일련의 행동을 호출했을 어떤 결과가 나오는지 명시
- 단어 일곱개를 넘어가면.. 너무 긴 이름
- given-when-then 의 양식을 쓸수도
- givenSomethingWhenDoingThisBehaviorThenSomeResultOccurs
- 근데 너무 길다.. -> given절 생략
- doingSomeOperationGeneratesSomeResult
- 다른 사람에게 의미있게 만들기!
4.5.2 테스트를 의미있게 만들기
- 테스트가 무슨 일을 하는지 바로 파악할 수 있도록 이름을 개선
- 지역 변수 이름 개선
- 의미있는 상수 도입
- 햄크래스트 단언
- 커다란 테스트를 나눠 집중적인 테스트 만들기
- 공통 초기화/정리가 필요한 경우 @Before/@After 사용
- 테스트 공통화
4.6 @Before/@After
- @Before는 중복된 초기화가 있을 경우 공통화를 위해 사
- @Before은 매번 테스트 메서드 실행에 앞서 실행됨
- 초기화가 늘어갈 경우 @Before 메스드를 여러개로 분할
- 이 경우 실행 순서를 보장하지 않음
- 일정한 순서가 필요하다면 단일 @Before 메서드로 결합하여야 함
- @After는 각 테스트를 한 후에 실행
- 테스트가 실패하더라고 실행됨
- 테스트에 발생하는 부산물을 정리
4.6.1 BeforeClass & AfterClass
@BeforeClass 모든 테스트 실행하기 전 한번만
@AfterClass 모든 테스트 실행 후 한번만
4.7 테스트를 의미있게 유지; 항상 통과하도록
4.7.1 단위 테스트는 빨라야
- 외부 자원에 접근 시 목객체 활용하여 빠르게
- 필요하다고 생각하는 테스트만 실행
- BUT 주기적으로 전체 테스트를 돌려 문제를 바로 찾을 수 있도록(묵히지 않도록)
- 이게 힘들다면 변경되는 클래스 단위/함수 단위의 테스트라도 실행해서 테스트가 통과되도록 유지해야
- -> 견딜 수 잇는 만큼 많은 테스트 실행하
4.7.2 테스트 제외
테스트 실패 시 주석처리말고 @Ignore
테스트 돌리면 몇 개의 테스트가 skip 되었는지 알려
728x90
반응형