테스트 자동화와 Mocha
테스트는 ‘왜’ 하는가?
코드를 만들고 매번 수동으로 테스트 하고 수정하는 작업은 불완전함 모든 유스 케이스에 대응 불가능
- 테스트 자동화는 테스트 코드가 실제 동자겡 관여하는 코드와 별개로 작성되어야 가능
Behavior Driven Development (BDD)
테스트, 문서, 예시를 한데 모아놓은 개념
- 스펙(명세서) : 코드를 작성하기 전에 코드의 할 일을 상상한 후 이를 자연어로 표현 한 산출물
다양한 유스 케이스와 자세한 설명, 테스트 담김
- 스펙 구성요소
- describe(“title”, function() {…})
구현하고자 하는 기능에 대한 설명 it 블록을 한데 모아주는 역할
- it(“유스케이스 설명”, function() {…})
첫번째 인수엔 특정 유스 케이스에 대한 설명. 자연어로 작성 두번째 인수엔 유스 케이스 테스트 함수
- assert.equal(value1, value2)
it 블록 내부의 코드 기능 제대로 구현 시 에러없이 실행 명세서는 실행 가능. 명세서 실행 시 it 블록 안의 테스트 실행
개발 순서
- 명세서 초안 작성. 기본적인 테스트 포함
- 명세서 초안에 따른 코드 작성
- 테스트 위해 Mocha 테스트 프레임워크 사용해 명세서 실행. 에러 출력되지 않을 떄 까지 코드 수정
- 모든 테스트 통과하는 코드 초안 완성
- 고려하지 않던 유스 케이스 추가
- 세번째로 돌아가 수정
- 기능 완성까지 3~6 반복
반복적인 작업 완료 시 완전히 동작하는 코드와 테스트 둘 다 확보
스펙 실행하기
라이브러리 리스트
- Mocha : 핵심 테스트 프레임워크, describe, it 같은 테스팅 함수 제공
- Chai : 다양한 assertion 제공
- Sinon : 함수의 정보 캐내는 데 사용
코드 초안
통과 만을 목적으로 코드 간단히 작성
스펙 개선
함수 제역할 테스트 위해 더 많은 유스 케이스 추가
- 스펙 테스트 추가 방법
- 기존 it 블록에 assert 하나 더 추가
첫 번째 assert 실패 시 두 번째 결과 알 수없음
- 테스트 하나 더 추가 (it 블록 추가)
둘 다 알 수 있음
- 테스트 하나에선 한 가지만 확인
코드 개선
여러 테스트 통과할 수 있는 코드로 개선
중첩 descibe
새로운 테스트 ‘하위 그룹’ 정의 시 사용
-
befor/after 와 beforeEach/afterEach
-
before/after : 전체 테스트 전/후 실행
-
beforeEach/afterEach : 매 it 전/후 실행
스펙 확장
조건이 맞지 않을 때 맞는 값 반환하는지 검사하는 테스트 추가.
- 다양한 assertion
Chai 에서 다양한 assertion 지원
스펙
스펙이 있어야 대규모 프로젝트에서 함수 개선하거나 변경 가능.
- 테스트 하지 않았을 시
-
대책없이 코드 변경해서 버그 발생
-
수정이나 개선 기피
- 잘 테스트 된 코드는 더 나은 아키텍쳐 만듬.
요약
-
테스트는 모든 유스 케이스에 대응해서 완전히 작동하는 코드 만들기 위해.
-
Behavior Driven Development (BDD) 는 테스트, 문서, 예시를 한데 모은 개념
-
개발순서는 테스트에 따라 정해짐
-
스펙이 있어야 대규모 프로젝트에서 함수를 개선하거나 변경 가능
-
잘 테스트 된 코드는 더 나은 아키텍쳐 만듬