Code/Test 18

[단위 테스트] 5-1. 목과 테스트 취약성: 목

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. Mock vs Stub테스트 대상 시스템과 그 협력자 사이의 상호 작용을 검사할 수 있는 테스트 대역구분Mock (목)Stub (스텁)역할외부로 나가는 상호 작용을 모방하고 검증내부로 들어오는 데이터/행위를 모방목적SUT가 의존 대상에 정확히 호출했는지 검증SUT가 의존 대상에서 입력 데이터를 제공받도록 구성방향Out-bound (외부로 나가는 호출)In-bound (내부로 들어오는 호출)검증 여부✅ 상호작용 검증 (호출 횟수, 순서, 인자 등) ❌ 호출 여부나 인자 등 검증하지 않음예시이메일 전송 여부, 결제 API 호출 여부 등DB에서 회원 조회 결과 반환, 외부 API에서 응답 반환 등적합한 상황부작용 발생 확인 (ex. 알림,..

Code/Test 2025.01.24

[단위 테스트] 4-2. 좋은 단위 테스트의 4대 요소: 이상적인 테스트

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.3. 이상적인 테스트를 찾아서테스트의 가치좋은 단위 테스트의 4대 특성을 곱하여 얻은 결과 (추정치)소수의 가치있는 테스트가 평범한 테스트보다 프로젝트 성장에 훨씬 더 효과적테스트 스위트에 테스트를 계속 둘지 여부를 결정할 수 있음임계치를 충족하는 테스트만 두어, 책임을 적절하게 맡도록 해야 함 이상적인 테스트를 만들 수 있는가?이상적인 테스트는 네 가지 특성 모두에서 최대 점수를 받는 테스트실제로는 세 가지 특성(회귀 방지, 리팩터링 내성, 빠른 피드백)이 서로 충돌하여 모두를 동시에 만족하는 것은 불가능함 핵심 전략항목설명하나의 특성을 완전히 버릴 수 없다하나를 버리면 곱셈 규칙(가치의 곱)에 의해 전체 테스트의 유용성이 0에 가까워짐..

Code/Test 2025.01.24

[단위 테스트] 4-1. 좋은 단위 테스트의 4대 요소: 4대 요소

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. 좋은 단위 테스트의 4대 요소요소설명문제 상황 / 원인해결 방안회귀 방지기존 기능이 수정으로 인해 망가지지 않도록 방지코드 변경 후 기능이 동작하지 않음테스트를 통한 기능 보호책임 있는 코드 작성리팩터링 내성리팩터링 시에도 테스트가 정상적으로 동작하는 성질구현에 밀접하게 의존상태 검증이 불안정결과 기반 테스트구현 디테일 분리└ 거짓 양성(허위 경보)실제로는 문제 없지만 테스트는 실패하는 상황빠른 피드백테스트가 빠르게 실행되어야 실시간 피드백이 가능외부 의존성으로 느려지거나 무거워짐빠른 단위 테스트 설계외부 의존성 격리유지 보수성가독성, 유지 비용, 실행 비용 등을 평가 └ 이해 난이도테스트가 얼마나 직관적이고 쉽게 읽히는가복잡한 준..

Code/Test 2025.01.19

[단위 테스트] 3. 단위 테스트 구조

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. AAA 패턴테스트를 준비, 실행, 검증 세 부분으로 나누어 구성하는 방법스위트 내 모든 테스트가 단순하고 균일한 구조를 갖는 데 도움이 됨단계설명Arrange테스트를 위한 객체(SUT) 및 의존성 설정Act테스트 대상 메서드 호출 (동작 실행)Assert결과 확인 (반환 값, 상태 변화, 호출 여부 등 검증) 2. 권장 사항항목권장 사항이유 및 설명구절 수 제한한 테스트 내 여러 Arrange, Act, Assert 구절 피하기단일 동작 단위만 검증해야 함여러 실행은 단위 테스트가 아닌 통합 테스트임조건문 회피테스트 내 if, switch 등 분기문 피하기복잡도 증가테스트 이해도 저하한 테스트에 여러 경우를 넣지 말고 분리해야 함메서..

Code/Test 2025.01.07

[단위 테스트] 2-2. 단위 테스트란 무엇인가: 런던파와 고전파

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 2. 런던파와 고전파격리 특성에 따라 크게 두 가지 스타일로 나뉨항목런던파 (London School)고전파 (Classical School)테스트 단위작은 코드 조각 단위단일 동작 단위 중심TDD 방식하향식 TDD– 전체 설계/인프라 → 상위 → 하위 구현상향식 TDD– 작은 단위 → 상위 통합의존성 처리모든 의존성을 Mock으로 대체 (불변 비공개 제외)공유 의존성만 Fake/Stub으로 격리 (나머지는 실제 객체 사용)중심 철학상호작용 기반 테스트- 협력자와의 상호작용을 테스트상태 기반 테스트- 결과를 중심으로 동작 검증장점- 문제 위치 파악 쉬움 (테스트 입자성 높음)- 신뢰도 높은 테스트 가능 (실제 객체와의 상호작용)- 현실적..

Code/Test 2025.01.07

[단위 테스트] 2-1. 단위 테스트란 무엇인가: 단위 테스트란

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. '단위 테스트'의 정의작은 코드 조각 단위를 독립적으로 빠르게 검증하는 테스트 격리성독립적으로 실행 가능한 상태순서에 의존하지 않아야 함의존성 종류설명문제점해결 방법공유 의존성테스트 간에 공유되는 상태나 데이터ex) 정적 가변 필드, 싱글턴, 전역 변수테스트 간 상호 간섭 발생공유 제거테스트마다 초기화비공개 의존성코드 흐름상 드러나지 않는 의존성ex) JDBC 연결, 시스템 시계 접근, 숨겨진 서비스 의존성 등숨겨진 실패 원인(원인을 파악하기 어려움)메모리 기반 프록시프로세스 의존성외부 프로세스에 의존하는 시스템 구성 요소ex) 메시지 큐(RabbitMQ), 백그라운드 워커(Spring Batch 등)외부 시스템이 테스트에 영향Moc..

Code/Test 2025.01.07

[단위 테스트] 1-2. 단위 테스트의 목표: 커버리지 지표

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. 테스트 스위트 품질 측정커버리지 지표테스트 스위트가 소스 코드를 얼마나 테스트하는 지를 백분율로 나타내는 지표테스트 스위트의 품질을 평가하는데 자주 사용됨종류항목설명코드 커버리지- (실행된 코드 라인 수) / (전체 코드 라인 수)- 코드가 얼마나 테스트되었는지를 측정함분기 커버리지- (통과한 분기 수) / (전체 분기 수)- 조건문(if, switch)의 모든 분기 실행 여부 측정- 코드 커버리지보다 더 정밀하고 정확한 테스트 평가 가능 예시) 분기 커버리지더보기public boolean isEligibleForDiscount(int age, boolean hasCoupon) { if (age >= 18) { // 분기 1 ..

Code/Test 2025.01.06

[단위 테스트] 1-1. 단위 테스트의 목표: 단위 테스트 목표

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 1. 테스트 코드 작성의 중요성새로운 기능을 구현할 때 새로운 버그가 나타날 가능성이 발생함 (지속적으로 테스트 코드를 작성해야 함)코드의 설계가 적절하지 못하면, 테스트 코드 작성이 어려워지고, 잘못된 테스트 코드를 작성할 가능성이 높아짐잘못된 테스트 코드는 신뢰도를 떨어뜨리므로, 오히려 상황을 더 악화시킬 수 있음 2. 소프트웨어 엔트로피프로젝트는 시간이 지날수록 코드베이스의 복잡성과 불확실성이 증가하는 경향이 있음 흐름엔트로피 증가코드 변경 시, 복잡도가 증가함예기치 못한 문제 발생코드가 복잡해질수록, 새로운 코드를 추가할 때 부작용 발생 가능성이 커짐신뢰성 하락테스트가 없는 프로젝트는 처음엔 빠르게 개발되지만 점점 코드 작성이 느..

Code/Test 2025.01.06