테스트 특강 내용에서 주어담았던 내용들을 다 짬뽕시켜서 이 글에 다 넣었습니다. 이번 특강 너무 재밌었어요~
여기서 말하는 테스트는 수동 테스트를 제외한 프로그램과 코드를 이용한 자동 테스트들을 말한다.
1. 사람이 직접 모든 경우의 수를 테스트 하는 것은 한계가 있기 때문이다.
2. 테스트 코드를 작성해야 코드에 대한 확신을 가지고 리팩토링을 진행 할 수 있다
3. 테스트 코드가 명세서가 된다
실제로 있었던 일을 각색했습니다.
간단하게 react앱을 실행하고 브라우저 화면을 확인하거나, 포스트맨으로 API 테스트 정도는 할 것 이다.
많은 테스트케이르를 테스트 할 수는 없겠지만 수동 테스트도 충분히 한다면 일단은 문제는 없을 것이다.
테스트를 진행을 하고 나서 리팩토링을 진행한다면 각 코드의 기능에 대해 알 수 있고, 리팩토링 이후에도 코드의 해당 기능이 제대로 작동하고 있는지 알 수 있다.
각 함수에 대해 인풋 아웃풋이 정확히 무엇인지 잘 작동하는지 확신을 가지게 되서 훨씬 리팩토링이 수월할 것이다.
그리고 보다싶이 위의 시나리오3
을 보면 리팩토링 이후에 이전의 기능들을 보장하지 않는 경우가 있다.
리팩토링의 정의는 기능에 대한 변화 없이 코드 품질을 올리는 행위이다. (나는 리팩토링을 한게 아니다)
리팩토링 자바스크립트
라는 책에서는 아예 '테스트 없이 리팩토링을 진행하는 것은 리팩토링이 아니다'라고 말하고 있다.
코드 기능 추가
와 리팩토링
2가지 개발 모드마틴 파울러는 코드 기능 추가
와 리팩토링
2가지 모드로 개발을 진행해야 된다고 한다.
코드 기능 추가
는 코드가 이전과 동작이 달라지게 하고 새로운 기능을 추가하는 행위이고, 리팩토링
은 기존 동작을 보장하면서 설계 수준을 올려서 소프트웨어의 품질을 올리는 행위라고 한다.
엄격히 구분해야 되며 코드 기능 추가
중에는 리팩토링
을 해서는 안되고 리팩토링
중에는 기능 추가
를 해서는 안된다.
그런데 여기서 유의해야 될 점이 버그를 고치는 것도 마찬가지로 기능 추가
행위에 포함이된다.
이 말의 핵심은 반드시 리팩토링 진행 하기 전에 버그를 먼저 고쳐야 된다라는 소리다.
반드시 기능 추가와 리팩토링은 구분 되어야한다.
[마틴 파울러] 리팩토링의 중요성 feat.테스트 코드를 짜는 이유(한글 자막) - YouTube
종속성들의 버전을 올린다음에도 기능들을 모두 업데이트 한다음 해당 코드가 여전히 잘 작동되는지 확인을 해야한다.
가능하면 모든 코드 실행 흐름과 시나리오를 테스트 해야 될 것이다. 왜냐하면 이전 종속성들이 버전과 동작이 크게 달리지는 경우가 많으니까
eslint가 대표적이다. eslint를 v9버전으로 안올리는 사람이 너무 많다.
테스트를 작성하면 초기 단계(코드 작성 단계)에사 버그 진압이 가능해진다.
배포되서야 버그를 확인하게 되는 것은 너무 끔찍하다.
일단 대표적인 테스트 방식은 E2E 테스트(종단테스트)
와 유닛 테스트(단위 테스트)
가 있다.
테스트 방법은 다음 글에서 적을 것이고 여기서는 테스트를 할 때 주의사항을 적고 마치도록 하겠다.
함수를 테스트 한다면 함수에 내부 동작에 대한 테스트가 아니라 인풋들(매개변수 참조 변수, this, 등)과 아웃풋(리턴값, 사이드이펙트)를 테스트 해야 된다는 뜻이다.
왜냐하면 세부 구현 사항들은 언제든지 달라질 수 있고, 리팩토링을 통해 더 나은 품질의 세부사항들이 항상 바뀐다.
react 코드를 작성한다면 특정 외부 서버 API에 의존하는 동작들도 있고, 백엔드라면 특정 상황이나 DB에 의존하는 코드들이 있다.
이런 코드들을 임의의 가짜 데이터와 가짜 서버, mock을 만들어서 테스트를 해야된다. 그렇지 않으면 테스트의 성공/실패 유무가 외부 서버나 외부 데이터에 달려 있게 된다.
우리는 그런 외부 API 테스트나 DB테스트가 아니라 우리의 함수와 react 컴포넌트를 테스트할 것이다.
마감이 다가오면 테스트를 일일히 다 작성하기 어려울 때도 많다. 그렇다고테스트 코드가 중요하다고 중요한 기능들 만드는 것을 내팽겨처리는 것은 맞지 않다.
이럴 때는 수동 테스트라도 꼼꼼하게 해야한다.
PR에 내가 만든 기능을 최대한 자세히 설명해서 코드가 내가 의도하지 않은 방향으로 수정되버리는 것을 막아야한다.
그리고 PR을 올리기 전에 다른분들 코드를 merge를 하고 프로그램을 실행시켜서 수동으로 꼼꼼히 다 테스트를 해야한다.
테스트를 진행하는 것은 미래의 나를 위해서이다. 나중에 코드를 까보면 이게 뭐였는지 알 수없고. 코드도 유지보수가 필요해보이는데 코드를 조금만 고쳐도 고장나버린다. 이럴 때 과거에 나한테 '아 테스트 코드를 짜둘 걸...' 하고 후회를 하게 될 수도 있다.(그러게요. 테스트 코드를 짜둘걸 내가 왜그랬을까요.)