해당 게시물은 인프런 "Java/Spring 주니어 개발자를 위한 오답노트" 강의를 참고하여 작성한 글 입니다.
1. 용어 정리
Regression
- 회귀 버그 : 서비스를 제공하지 못하던 상황으로 회귀하는 상황.
- 회귀 테스트 : 서비스에 회귀 버그가 있는지 확인하는 테스트.
SUT
- System under test : 테스트 하려는 대상
TDD
- RED : 깨지는 테스트를 먼저 작성한다.
- GREEN : 깨지는 테스트를 성공시킨다.
- BLUE : 리팩토링 한다.
BDD
- Behaviour driven development : 메소드 위주의 테스트코드보다 시나리오에 기반하여 테스트 하는 방식
- given - when - then
flaky
- 불규칙한 테스트: 대상 코드에 아무런 변경이 없음에도 불구하고 실패하는 테스트
brittle
- 깨지기 쉬운 테스트 : 실제로는 버그가 없음에도, 심지어 검증 대상 코드와 관련조차 없는 변경때문에 실패하는 테스트
- 테스트에 필요한 가정들이 명시적으로 작성되있지 않을 경우 발생
interaction test
- 상호작용 테스트 : 대상함수의 구현을 호출하지 않으면서 그 함수가 어떻게 호출되는지를 검증하는 기법
- 상호작용 테스트를 이용하여 상호작용을 테스트하는 것 보다는 상태를 테스트하는 것을 추천
Dummy
- 더미: 아무런 동작도 하지않고, 그저 코드가 정상적으로 돌아가기 위해 전달하는 객체
Fake
- Local에서 사용하거나 테스트에서 사용하가위해 만들어진 가짜 객체, 자체적인 로직이 있다는게 특징
Stub
- 미리 준비된 값을 출력하는 객체
- mockito 프레임 워크를 사용하여 구현 가능
Spy
- 메소드 호출을 전부 기록했다가 나중에 확인하기위한 객체
2. Mock vs BDDMockito
BDDMockito는 BDD를 사용하여 테스트코드를 작성할 때, 시나리오에 맞게 테스트 코드가 읽힐 수 있도록 도와주는 Mock 프레임워크에서 이름만 변경한 프레임 워크이다.
참고: https://velog.io/@lxxjn0/Mockito%EC%99%80-BDDMockito%EB%8A%94-%EB%AD%90%EA%B0%80-%EB%8B%A4%EB%A5%BC%EA%B9%8C
3. private 메소드를 테스트해야할까?
참고: https://kukim.tistory.com/84
4. 그렇다면 final 메소드는?
- final 메소드를 스터빙(stubbing)해야 할 필요성이 있다면, 설계를 재고해야 한다는 신호일 수 있다. 의존성을 약화시키는 방법을 모색하자.
5. DRY < DAMP
- DRY(건조한) : Don't Repeat Yourself
- DAMP(습한) : Descriptive And Meaningful Phrase
'반복하지 마라(Don't Repeat Yourself)' 원칙과는 달리, '설명적이고 의미 있는 구문(Descriptive And Meaningful Phrases)'을 사용하여 테스트 코드를 이해하기 쉽게 만드는 것이 테스트코드 작성에 있어서는 올바르다.
참고 : https://stackoverflow.com/questions/6453235/what-does-damp-not-dry-mean-when-talking-about-unit-tests
6. 의존성 추상화
테스트하기 어려운 의존성(예: 난수 생성, 시간 관련 기능, HTTP 요청 등)을 처리하기 위해 추상화를 사용한다.
참고 : [되새김질] 의존성에 대한 고찰 , [되새김질] 추상화에 대한 고찰
테스트는 단순히 문제를 찾아내는 과정이 아니라, 우리의 코드가 더 견고하고 신뢰할 수 있도록 만드는 과정이다. 테스트를 통해 코드의 내구성을 높이고, 유지보수를 단순화할 수 있다. 테스트 루틴이 없는 코드는 레거시한 코드라고 생각한다.