눈으로 다 확인할 수 있는 프론트 기능들이지만, 모든 부분을 완벽하게 테스트하기는 쉽지 않다.
그렇게 모든 상황을 다 테스트 하더라도, 시간이 너무 오래 걸린다.
프로젝트의 사이즈가 커지면 커질수록, 협업을 하게 되는데, 동료 개발자가 작업했던 부분을 작업하게 되는 경우가 종종 생긴다. 이때, 의도되지 않은 버그가 있다면 그대로 배포될지도 모른다. 이때, 테스트를 통해 검사할 수 있다. => 실무에서는 이전버전에서 이미 배포된 기능의 코드를 이번 버전에서 고칠 경우가 생기는데 이미 이전 버전에서 Qa가 끝난 부분이기 때문에 자세히 보지 않는 경우가 있다. 이럴 경우 치명적인 버그가 배포될 경우가 생기기 쉽다.
가장 중요한 것은, 릴리즈 당일, 팀원들과 가족 같은 분위기를 형성하게 될 수 있는 상황을 미연에 방지한다.
2. 유닛 테스트
작은 단위(컴포넌트 정도)의 기능동작을 확인하는 테스트
컴포넌트가 잘 렌더링 되는가?
함수는 올바르게 동작하는가?
state를 올바르게 사용하고, 올바르게 setState 하는가?
3. 통합 테스트
프로젝트가 전체적으로 올바르게 동작하는지를 확인하는 테스트
수많은 컴포넌트들이 서로 잘 동작하며 각각의 역할을 올바르게 하여 정상적으로 동작하는가?
DOM 이벤트가 올바르게 화면을 변화시켜 주는가?
4. Jest
자바스크립트 코드 테스트 자동화 Tool 중 대표적인 Jest
가장 단순한 테스트 툴, 기본적인 설정을 해 줄 필요가 없어서 간단하다.
스냅샷 기능을 지원하여, 오브젝트가 변경되면 에러를 보여줄 수 있다. -> 렌더링 된 컴포넌트의 변경도 체크할 수 있다.
테스트 코드는 작업물과 완전히 분리되어 있다.
API도 -coverage 옵션을 사용해 커버리지를 확인할 수 있도록 되어 있어, 매우 단순하다.
5. 실전 테스트
먼저 프로젝트를 생성한다. (cra을 해도 테스트해 보기는 괜찮다! 다 깔려있다! 만약, yarn init 했다면 babel도 설치해 주자 yarn add --dev babel-jest @babel/core @babel/preset-env)
땡! 심지어 deep equality하게 검사해야 통과한다고, toStrictEqual을 사용하란다. 친절 그잡채
test("내 친구의 이름은 hendrix, 나이는 20이야.", () => expect(getFriend("hendrix", 20)).toStrictEqual({ name: "hendrix", age: 20 }));
코드를 수정한 이후 성공!
여기서 toEqual과 toStrictEqual의 차이는 toStrictEqual가 더 엄격하게 undefined도 허용하지 않는 함수이다.
8. 여담
부트캠프를 진행하면서 보았던 문제 형식의 스프린트는 이런 식으로 만드는 구나를 깨달았다. (그럼 계산을 위한 코드도 어딘가에 공식처럼 적혀 있다는 것인데... 그거 뜯어보면 전부 간단하게 해결할 수 있다는 것인데... 그걸 찾는다면 이미 개발 실력이 늘어날 듯하다)
한 발자국 더 나아가면, 저런 테스트 코드를 캡슐화하여 잘 숨겨놓고, 더 어렵게, 그리고 더 엄격하게 검사하는 코드도 넣으면 참 좋은 스프린트를 만들 수 있지 않을까?라는 생각도 들지만 이미 부트캠프를 나온 지 1년 6개월은 넘어서 의미가 없다 흑흑,
실무에서는 테스트 코드를 작성할 수 있을까?라고 한다면 스타트업의 경우 거의 불가능... 하지 않을까 싶다. 규모가 그리 크지 않고, 프론트 개발팀 구성원이 몇 명 없는 경우, 항상 개발시간에 쫓겨가다 보면, 데드라인 맞추기도 급급해서 테스트 코드까지 작성할 시간이 항상 부족하다. 조금만 여유가 있다면, 오히려 Qa 시간도 줄이고, 탄탄한 코드로 이후 유지보수가 뛰어나다는 생각을 운영진도 해 줬으면...!이라고 생각만 하고 있다 흑흑.
하지만 짬날 때마다 테스트 코드를 작성해 놓으면 충분히 도움이 될 것이다. 지금 업무로 진행하는 프로젝트의 특성(기획이 한 번에 픽스되어 나오지 않고, 조금씩 쌓이고 쌓이고 하는 구조) 덕분에 같은 작업자들끼리 기능적으로 꼬이는 부분이 있었는데, 테스트 코드가 있다면 충분히 커버될 것이라고 생각했다.
className을 고민하지 않아도 된다. 반복해서 사용해야 하는 스타일 일 경우 string으로 스타일 자체를 설정해서 여기저기 파일에서 import 해서 사용할 수 도 있다. 위의 코드처럼 사용하며, 추가로 다른 스타일을 넣어 줄 수도 있다.
자체 스타일 가이드를 제공하여 동일한 사이즈와 컬러로 통일시켜서 디자인 할 수 있다.
3. 단점
가독성이 나쁘다.
스타일 자체를 변수로 잘 선언해서 재사용한다면 어느정도 커버가 가능하다.
config 파일을 고쳐서 일정한 커스텀한 스타일을 추가로 넣어줄 수도 있다. ex) text-14 text-white => text(14 white)
어디에 어떤 속성을 넣었는지 혹은, 관심사 분리가 떨어져 유지보수가 곤란한 경우가 생긴다.
작업자들 간의 사용을 문서화하고, 잘 협의한다면 크게 문제가 되지 않는다. (사실 config 파일을 잘 살펴보면 모두 일정한 규칙이 있을 것이므로 크게 어렵진 않다. 그리고 디자이너와 협업하는 경우라면 스타일 가이드를 만들어 주기 때문에 그 스타일 대로 공용 컴포넌트 등을 작업해 놓으면 통일시켜서 사용할 수 있다)