Search
Duplicate
🏈

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

섹션 0. 오리엔테이션

섹션 1. 이론 수업

테스트에 대한 개요와 개발자가 해야할 고민

테스트란?
어떤 시스템이 동작하는지 검증하는 과정으로 하나는 사람이 확인하는 인수 테스트와 자동 테스트로 나뉜다.
TDD의 장단점
장점1. 깨지는 테스트를 먼저 작성해야 하므로 인터페이스를 먼저 만드는 것이 강제된다.
⇒ 행동에 집중하겠다. What/Who 사이클을 고민해볼 수 있게 도와준다.
장점2. 장기적인 관점에서 개발 비용 감소
개발자의 고민
무의미한 테스트
커버리지를 채우기 위한 테스트는 필요한가?
느리고 쉽게 깨지는 테스트
테스트가 불가한 코드
의존성이 적절히 분리되지 않은 코드

테스트의 필요성과 테스트 3분류

1.
필요성
레거시 코드란 테스트가 없는 코드이다.
회귀가 발생하는 것을 두렵기 때문에 테스트가 필요하다.
좋은 테스트를 작성하면 좋은 아키텍처가 따라온다.
SOLID와 테스트는 밀접한 관계를 갖는다.
SRP: 테스트가 너무 많아져서 이게 무슨 목적의 클래스인지 알 수 없다.
OCP: 테스트와 프로덕션을 나눠 작업하면 자유자재로 결합도가 낮아진다.
LIP: 이상적으로 테스트는 모든 케이스를 커버하므로 서브 클래스의 치환 여부를 테스트가 판단해준다.
ISP: 불필요한 의존성을 실제로 확인할 수 있다.
DIP: 가짜 객체를 이용해 테스트하려면 의존성이 역전되어있어야 한다.
2.
테스트의 3분류
E2E, 통합, 단위의 정의는 무엇인가? 구글은 각각 대형, 중형, 소형이라고 한다.
소형 - 단일 서버, 단일 프로세스, 단일 스레드, 파일 입출력 사용 x, Blocking call x
중형 - 단일 서버, 멀티 프로세스, 멀티 스레드
대형 - 멀티 서버

테스트에 필요한 개념

BDD가 테스트를 작성해야할만큼 중요한 로직을 찾는데 도움을 준다.
상호작용 테스트
상태 검증, 행위 검증
테스트 픽스쳐
비욘세 규칙
유지하고 싶은 상태가 있으면 전부 테스트로 작성하라.
테스트는 그 자체로 정책이고 계약이다.
테스트 대역
dummy, spy, mock, stub, fake

의존성과 Testability

의존성, 의존성 주입
의존성 주입은 의존성을 약화시킨 것이지 없앤 것이 아니다.
new가 사실상 하드 코딩이기 때문이다.
의존성 역전
상위 모듈은 하위 모듈에 의존해서는 안 된다.
추상화는 세부 사항에 의존해서는 안 된다. 세부사항이 추상화에 의존해야 한다.
테스트를 잘 하려면 의존성 주입과 의존성 역전을 잘 다룰 수 있어야한다.
숨겨진 의존성이 테스트를 어렵게 만든다.
의존성 주입과 역전을 사용해서 해결해야 한다.
대부분의 소프트웨어 문제는 의존성 역전으로 해결이 가능하다.
테스트 가능성
얼마나 쉽게 input을 변경하고 output을 검증할 수 있는가?

섹션 2. 1부 실기 수업 - 어쨌든 테스트 코드

섹션 3. 방향성 탐색

레이어드 아키텍처의 문제점과 해결책

유사한 기능들을 같은 계츠으올 묶어 관리하는 방식의 아키텍처 구조로 쉽다.
단점
DB 주도 설계를 유도한다. 모든 것이 영속성 계층을 토대로 만들어진다.
도메인을 파악하는 것이 먼저다.
도메인이 죽는다. 서비스가 모든 비즈니스 로직을 다 처리한다.
동시 작업이 불가하다.

섹션 4. 2부 실기 수업 - 구조적 변화를 주는 테스트 코드

패키지 구조 개선

연관 객체를 적절히 배분하는 것이 좋다.
DTO라고 DTO에 박아두지 말자.

섹션 5. 진화하는 아키텍처