참고문서 : https://www.baytechconsulting.com/blog/test-pyramid-vs-testing-trophy-whats-the-difference
프론트엔드에서 테스팅이 필요한 이유 2가지
1. Agile과 DevOps의 확산
- Agile과 DevOps 프로젝트 flow에 E2E 테스트만을 사용하여 소프트웨어 개발을 할 경우 뒤늦게 버그를 찾고 원인을 찾는데 시간이 많이 소요되게 된다. 특히 E2E 테스트에서는 종합적인 결과만을 피드백하기 때문에 단위 기능에서 발생하는 에러를 찾기가 힘들다.
2. 프론트엔드 개발의 고도화
- 프론트엔드 개발이 고도화되면서 다양한 라이브러리와 인터페이스의 상호작용 또한 고도화되었다. 이러한 기능들을 구현하기 위한 코드도 고도화되는 것 또한 당연한 것이다. 이러한 이유로 테스팅을 통한 코드 품질 확보와 기능의 안정성 확보를 통해 테스트 코드를 작성하는 시간보다 더 많은 시간을 일찍 찾아낸 오류를 해결하고 기능을 완성하는데 사용할 수 있게 되었다.
테스팅의 종류
참고자료 : [10분 테코톡 - 도비의 프론트엔드 테스트 종류] https://www.youtube.com/watch?v=pkYUcKWOqPs&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC
1. 블랙박스 테스트 : 내부 동작을 모르고 입/출력만을 테스트
2. 그레이박스 테스트 : 내부 동작을 알고 외부 사용자의 관점에서 진행하는 테스트
3. 화이트박스 테스트 : 소프트웨어의 내부 동작, 코드, 구조를 완전히 이해하고 진행하는 테스트
4. 단위 테스트 : 개별 모듈이나 함수의 동작을 테스트
5. 통합 테스트 : 여러 모듈이나 컴포넌트들을 함께 테스트하여 상호작용을 확인
6. UI 테스트 : 사용자 인터페이스의 디자인과 사용성을 테스트
7. 시스템 테스트 : 전체 시스템의 기능과 성능을 테스트
8. 기능 테스트 : 사용자의 관점에서 소프트웨어의 기능을 테스트
9. E2E 테스트 : 실제 사용자의 시나리오를 모방하는 테스트
10. 알파 테스트 : 개발자 외 사용자들이 소프트웨어를 사용하고 피드백을 제공하는 테스트
11. 인수 테스트 : 요구사항에 따른 기능 테스트
12. 성능 테스트 : 시스템의 성능, 부하, 응답시간을 측정하여 성능을 개선하는 테스트
...
테스팅 트로피
테스팅 트로피는 Guillermo Rauch가 제안한 개념으로 E2E 테스트 중심의 개발 테스트를 고도화된 현장에 맞게 새롭게 구상한 테스팅 개념이다. Rauch는 테스트 커버리지가 70%가 넘어가면 오히려 테스트를 통한 이익보다 시간적 손해가 더 많을 것임을 이야기했다.
테스팅 트로피의 가장 큰 특징은 "정적 테스트가 추가" 되었다는 점과 통합 테스트가 단위 테스트보다 크다는 점이다.
이는 에러를 발견하고 해당 에러를 해결하는데 있어, 단위 테스트보다 통합 테스트 단에서 이뤄질 때 더욱 효과적임을 주장하고 있다.
1. 정적테스트 : eslint / prettier / typescript 등
2. 유닛테스트 : Jest, React-testing-library 등
3. 통합테스트 : Supertest 등
4. E2E테스트 : Cypress 등
테스팅 피라미드
테스트 피라미드는 Mike Cohn의 Succeeding with Agile 책에서 소개된 개념이다. Cohn은 "여러 단위로 테스트를 구분하고", "더 많은 테스트를 지향하며", "높은 레벨일수록 테스트의 양이 줄어드는" 방식의 테스트를 소개한다.
Cohn은 테스트의 단위가 낮은 단계일수록 아이디어와 구현의 시간적 간극이 짧고, 불안정한 상태에 가깝기 때문에 많은 단위 테스트로 코드를 안정화시킬 필요가 있으며 이렇게 계층적으로 테스팅을 진행하며 개발을 했기 때문에 종단 간 테스트에 가까워질수록 테스트를 해야하는 양이 줄어든다고 이야기한다.