- 이번 퀘스트에서는 자동화된 테스트에 어떤 장점이 있는지, 어떤 식으로 구축할 수 있는지에 대해 알아보겠습니다.
- Automated Test
- TDD
- Unit Test
- Integration Test
- E2E Test
- Stub & Mock
- Jest
- Puppeteer
- 자동화된 테스트를 만드는 것에는 어떤 장점과 단점이 있을까요?
장점
- 더 빠른 테스트 주기
– 반복적 업무 감소
– 테스트 노력 절감 및 실수 감소
– 객관적 평가 기준 제공
– 효율적인 비용으로 유지보수 가능
단점
– 테스트 자동화 도구의 비용이 고가이며 유지비용 높음
– 초기 환경 및 테스트 설정에 많은 시간, 비용 소요
– 도구에 의해 생성된 테스트 자산 유지 비용 소요
– 테스트 스크립트 유지보수 어려움
- TDD(Test-Driven Development)란 무엇인가요? TDD의 장점과 단점은 무엇일까요?
TDD
TDD(Test Driven Development)란 '테스트 주도 개발' 이라고 한다.
반복 테스트를 이용한 소프트웨어 방법론으로, 엔지니어 켄트 벡(Kent Beck)에 의해 고안되었다. 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다. 짧은 개발 주기의 반복에 의존하는 개발 프로세스이며 애자일 방법론 중 하나인 eXtream Programming(XP)의 'Test-First' 개념에 기반을 둔 단순한 설계를 중요시한다.
eXtream Programming(XP)란?
미래에 대한 예측을 최대한 하지 않고,
지속적으로 프로토타입을 완성하는 애자일 방법론 중 하나이다.
이 방법으론은 추가 요구사항이 생기더라도, 실시간으로 반영할 수 있다.
장점
-높은 코드 안정성
짧은 주기의 테스트 코드 개발-리팩토링 단계를 거치며 끊임 없이 보완하고 철저한 모듈화를 통해 종속성과 의존성이 낮은 모듈로 조합된 소프트웨어 개발을 가능하게 하여 코드의 안정성을 높일 수 있다.
-재설계 시간의 단축
TDD는 설계 단계에서 테스트 시나리오를 작성하기 때문에 무엇을 해야하는 지 정의하고 생각할 수 있어 완성도 높은 설계로 이어진다.
이는 추후 설계가 변경되는 일을 방지할 수 있다.
-디버깅 시간의 단축
모듈 별로 테스트를 자동화를 하지 않는 다면 에러가 생겼을 경우 모든 레벨의 코드를 살펴봐야한다. 하지만 TDD의 경우 자동화된 단위테스트를 통해 특정 버그를 쉽게 찾을 수 있다.
단점
-생산성의 저하
한 번 개발할 코드를 2번 이상 반복하게 되어 일반적인 개발 방식보다 개발 시간이 늘어날 수 밖에 없다.
단순 개발이나 단발성 프로젝트의 경우 개발기간이 짧아 TDD를 적용하게 되었을 때 Ctrl + C, Ctrl + V를 통한 뻔하고 중복된 테스트 코드를 작성했을 때는 비효율적일 수 있다.
- 테스트들 간의 계층에 따라 어떤 단계들이 있을까요?
테스트의 난이도, 적용범위 및 역할 등에 따라 4가지 테스트로 나뉜다.
- 유닛 테스트, 통합 테스트, E2E 테스트는 각각 어떤 것을 뜻하나요?
Unit test (단위테스트) : 함수 하나하나와 같이 코드의 작은 부분을 테스트 하는 것.
Integration test (통합테스트) : 서로 다른 시스템들의 상호작용이 잘 이뤄지는지 테스트하는 것
E2E test (종단 간 테스트) : 사용자와 어플리케이션의 상호작용이 잘 이뤄지는지 테스트하는 것
- 테스트에 있어서 Stub과 Mock은 어떤 개념을 가리키는 것일까요?
Stub
-dummy를 이용하여 실제로 동작하는 것처럼 보이게 만드는 객체
-기능 구현이 안돼 있다.
-상태 검증을 위한 객체이다.
-상태 검증이란 메서드가 수행된 후, 객체의 상태를 보며 올바르게 동작했는지 확인한다는 뜻이다.
-객체를 다양한 조건으로 값을 만들어주고 던져줘도 항상 동일한 값을 반환한다.
Mock
실제 객체를 만들어 사용하기에 시간, 비용 등의 Cost가 높거나, 객체 서로간의 의존성이 강해 구현하기 힘들 경우 가짜 객체를 만들어 사용하는 방법이다.
-stub과 달리 행위 검증을 위한 객체이다.
-행위 검증이란 메서드의 리턴 값으로 판단할 수 없는 경우 특정 동작을 수행하는지 확인한다는 뜻입니다.
- Jest는 어떤 일을 하며 어떻게 사용하는 테스트 프레임워크일까요?
Jest : 단순함에 초점을 둔 페이스북에서 개발한 오픈 소스 자바스크립트 테스트 프레임워크이다. 비교적 사용이 간단하며 Babel, Typescript 등에 모두 사용할 수 있다.
Jest는 테스트가 전역 상태를 갖도록 하여 모든 테스트를 평행적으로 수행이 가능하게 한다. 또한, 빠른 테스트를 위해 이전 테스트에서 실패했던 것을 가장 먼저 실행하고, 테스트의 수행 시간을 예측하여 실행 순서를 재배치한다.
테스트의 코드 커버리지를 파악할 땐 --coverage Flag를 통해 간단하게 파악할 수 있다.
- Jest 이외의 테스트 프레임워크는 어떤 것이 있고 어떤 장단점이 있을까요?
Mocha
Node.js와 브라우저에서 실행되는 기능이 풍부한 자바스크립트 테스트 프레임워크이다.
비동기식 테스트를 간단하게 진행할 수 있다.
Mocha 테스트는 연속적으로 실행되어 유연하고 정확한 보고를 가능하게 하는 동시에 미검증 예외를 올바른 테스트 사례에 Mapping 한다.
Jasmine
자바스크립트 코드를 테스트하기 위한 동작 중심 개발 프레임워크이다.
Jasmine은 다른 Javascript 프레임워크에 의존하지 않으며, DOM이 필요하지 않다.
구문 자체가 꺠끗하고 명확한 구문을 가지고 있어서 쉽게 시험을 작성할 수 있다.
Puppeteer
Puppeteer는 Chromium이 포함되어 있고, 기본적으로 "Head가 없는" 상태로 실행된다. Head가 없는 브라우저란 쉽게 말해 Headless browser 는 UI 없이 간편하게 백그라운드에서 실행되는 브라우저이다.
실제로 브라우저 창을 띄우지 않고 백그라운드에서 가상으로 진행되며, 특정 페이지에 접속하고 렌더링 되는 과정 후 수행하고자 하는 코드를 수행하는데 용이하다.
- Puppeteer는 어떤 일을 하며 어떻게 사용하는 테스트 프레임워크일까요?
구글에서 만든 노드 라이브러리로 Headless Chrome 또는 Chrominum을 제어할 수 있다.
스크린샷을 찍어 PDF로 만들거나, SPA로 되어 있는 페이지를 크롤링하거나, UI 테스트, 키보드 입력 자동화, 최신 버전의 크롬 브라우저 환경에서의 테스트 등 매우 다양하다.
- 직전 퀘스트의 메모장의 서버와 클라이언트 각 부분에 유닛 테스트, 통합 테스트, E2E 테스트 등을 추가해 보세요.
npm test
명령을 통해 모든 테스트가 돌고 그 결과를 출력할 수 있어야 합니다.
- 테스트의 커버리지는 어떤 개념일까요? 프로젝트에서 테스트의 커버리지는 어떻게 접근하는 것이 좋을까요?