리팩터링 2판 챕터 4 테스트 구축하기에 대한 세미나 발표 자료이다. 리팩터링 책에선 테스트 코드에 대해 중요하다 하지만 자세히 다루고 있지 않기 때문에 간단한 TDD에 대한 설명과 내가 테스트 코드 공부하면서 느꼈던 것들을(+ 시행착오) 정리했다.
1. chapter 04_ 요약
리팩터링 2판의 챕터 4는 테스트 구축하기에 대한 내용이다. 하지만 테스트에 대해 자세히 다루지 않고 아래와 같이 구현코드에 대한 간단한 테스트 + 약간의 팁으로 끝난다.
해당 챕터를 요약해서 세미나를 준비하다 보니 테스트코드를 해본 적 없는 사람들이 대상이었기 때문에 내 마음대로 발표 자료로 만들기 좋은 문장 두 개를 가져와 발표를 준비했다.
2. 발표 자료로 만들기 좋은 문장 두 개
먼저 TDD에 대한 문장 (테스트를 작성하기 가장 좋은 시점은 프로그래밍을 시작하기 전이다.). 그리고 설계에 대한 문장이다. (코드는 항상 성격(역할, 책임)에 따라서 분리하는 것이 좋다.
3. TDD에 대한 설명
TDD를 하게 되면 원하는 기능을 추가하기 위해 무엇이 필요한지 좀 더 고민한다는 장점과 기능 구현에 급급하지 않고 전체적인 구조를 생각하게 된다는 장점이 있다.
아래 보이는 그림은 TDD 사이클이라고 불리는 그림이다. 레드 - 그린 - 리팩 터라는 이름으로 불리는데 레드의 단계에선 실패하는 테스트코드를 작성하고, 그린에선 해당 테스트코드가 성공하게끔 기능구현코드를 작성한다. 그리고 해당 코드를 리팩터링 하는 순서이다. 이때 리팩터링한 코드의 테스트도 이상 없이 통과되어야 한다.
해당 과정을 짧게 짧게 반복해서 코드를 작성해 나간다.
4. 테스트 코드를 처음 작성할 때 드는 생각
테스트 코드를 작성하려고 마음먹고 적용하려고 하면 드는 생각들이 있다. 먼저 테스트 관련 툴의 사용법을 익혀야겠다는 생각이 들어 jest나 react testing library와 같은 툴들을 공부한다.
하지만 막상 실제 구현환경에서 테스트 코드를 작성하려고하면 어떻게 시작해야 할지 막막한 생각이 들어 하지 작성하지 않게 된다.
5. 테스트하기 좋은 코드
사실 테스트 코드는 모든 걸 해결해주지 않는다. 테스트를 통해 코드를 개선하려고 하지말고 테스트 작성 전에 먼저 구현 코드를 좋은 코드로 변경해야 한다. 테스트하기 좋은 코드는 아래와 같다.
1. 입력 값이 같으면 항상 출력 값이 같은 코드
2. 외부의 것을 사용하거나 변경하지 않는 코드
결국 좋은 설계 바탕에서 테스트를 작성해야 좋은 구조의 코드가 나온다는 것이다.
6. 좋은 설계란?
좋은 설계는 낮은 결합도, 높은 응집도 그리고 비즈니스 로직이 보호되는 구조라고 생각한다.
7. 테스트 코드 연습하다가 겪었던 문제들
1번과 2번의 경우 의존성 주입을 사용하면 어떻게 외부 의존성을 테스트 하기 쉬운 유연한 형태로 변경가능한지에 대한 설명이다.
3번 구현에 대한 테스트는 내가 실제로 겪었던 실수에 대한 설명이다. 처음에 구현 방식을 주석으로 쭉 써놓고 한 줄 한 줄에 대한 테스트 코드를 작성했다. 당연히 결과를 확인하면서 작성했기 때문에 테스트코드 를 전부 작성할 수 있었고 해당 테스트가 통과하는 코드도 구현할 수 있었다.
하지만 이후에 구현 코드를 리팩터링 하려고 내부 구조를 수정했더니 기존의 성공했던 테스트코드가 전부 깨지는 것을 볼 수 있다. 리팩터링이 잘됐는지 확인하기 위해 작성한 테스트코드가 리팩터링에 의해서 깨지는 현상 이었다.
이런 방식이면 실질적인 테스트의 역할을 못하고 있다는 생각이 들어 여러 글이나 컨퍼런스 영상을 찾아보니 구현에 대한 테스트를 하지 말고 인터페이스에 대한 테스트를 해라 라는 말이 있었다. 구현 하나하나를 테스트하지 말고 해당 기능이 가져야 하는 가치 (인터페이스)를 테스트하라는 말이었다.
4번의 경우 DIP원칙 (의존성 역전 원칙)을 통해서 비즈니스 로직을 보호해야 한다는 내용이다. 실제로 repository 계층의 문제가 service 계층까지 번지는 예제를 들어 설명했다.
모든 예제 코드는 https://github.com/JooYoung2274/TDD_practice/tree/main/src/chapter04
'세미나' 카테고리의 다른 글
객체지향적으로 머드게임 만들기 - DI 프레임워크 만들어서 리팩토링 (0) | 2023.05.23 |
---|---|
객체지향적으로 간단한 머드게임 만들기 (0) | 2022.12.29 |
백엔드 아키텍처 관련 정리자료 (0) | 2022.12.02 |