Test

테스트가 왜 중요하고, 정말 필요할까요? 만약 필요하다면 모든 코드를 다 테스트 해야되는 것일까요.

왜 자바스크립트를 테스트 해야될까?

  1. ECMAScript 명세로 정의된 언어이며, 브라우저마다 각각의 런타임 구현체(implementation)을 가지고 있다. 그래서 우리가 can i use 같은 사이트에서 무언가를 검색하면 브라우저마다 호환성이 다른 것이다. 그러다보니 브라우저마다 약간씩 차이가 발생하고 버그 또한 존재한다.

  2. 언어 자체의 문제도 있다. 자바스크립트는 원래 넷스케이프라는 회사에서 제품 출시 일정을 맞출려고 열흘 만에 개발한 언어이다. 분명 일급 함수라는 점과 객체 프로토타입 등을 훌륭하지만, 형태가 너무 다양한 방식으로 변화할 여지를 남겨줬기 때문에 예기치 않은 문제들이 종종 생긴다. 예를 들어 자바스크립트의 객체는 뮤터블(mutable)하기 때문에 아래와 같은 것도 가능하다.

모든게 의도된 언어 설계이지만, 너무 많은 자유로 인해 개발자들이 실수할 가능성 또한 높아진 것이다.

3. 비직관적 타입 강제 규칙(non-intuitive type coercion rules)이 적용되있다. 이게 무엇인지는 자바스크립트를 비꼬는(?) 글이 있다면 자주 봤을 법한 아래와 같은 내용이다.

프론트엔드 코딩이건, 서버 코딩이건 소프트웨어 공학의 기본 원리는 다르지 않다. 컴포넌트 단위로 코드를 모듈화해서 적절하게 관심사를 분리(separation of concerns)시키자.

단위 테스트(Unit Test)

테스트 할 수있는 가장 작은 단위에 대한 테스트를 먼저 작성하고 그 사이의 복합 동작을 작성함으로써 복잡한 애플리케이션에 대한 포괄적인 테스트를 구축 할 수 있다.

단위 테스트 장점

  • 단위 테스트는 개발 초기에 버그를 찾는데 도움이 되며, 초기에 발견하므로 버그 수정 비용이 절감된다.

  • 프로젝트를 더 안전하게 만들어 준다. 예를 들어 리펙토링을 한다고 가정했을때, 리펙토링을 하기 전과 후에 동작성에 대한 보장을 단위 테스트를 통해 얻을 수 있다.

  • 잘 짜여진 테스트 케이스는 프로젝트 이해에 도움을 준다. 새로온 사람은 테스트 케이스에 적혀있는 테스트 내용만 보고도 해당 모듈이나 함수가 무슨 일을 하는지, 어떤 예외 처리가 되어있는지 한눈에 확인할 수 있다.

단위 테스트 단점

  • 아주 작은 것을 제외하고는 모든 실행 경로를 평가할 수 없기 때문에, 모든 오류를 잡아낼 수는 없다.

  • 테스트 케이스 실패를 정기적으로 검토하고 빠르게 수정할 수 있는 지속 가능한 프로세스를 구현해야 한다.

  • 온전하게 현실적인 테스트를 설정하는 것이 어렵기 때문에 정확성이 떨어질 수 있다.

Given / When / Then

BDD 스타일의 end-to-end 테스트 방법이다.

  • Given: 초기상황

  • When: 어떤 이벤트가 발생했을 때

  • Then: 기대되는 후속 결과

describe('(Given) 100원의 잔고가 주어졌고', () => {
  describe('(When) 10원을 인출했을 때', () => {
    test('(Then) 내 잔고는 90원일 것이다.', () => {
      // ...
      expect(balance).toBe(90);
    });
  });
});

Test Double

테스트 더블(Test Double)이란, 단위 테스트의 한 패턴으로 테스트를 진행하기 어려운 경우 이를 대신해 테스트를 진행할 수 있도록 만들어주는 객체를 말한다. 쉽게 말해 테스트 목적으로 프로덕션 객체를 대신할 수 있는 모든 경우에 대한 일반적인 용어이다.

  • Dummy - 더미 객체는 매개변수로 전달되지만, 실제로 사용은 되지 않고, 매개 변수를 채우는데 사용된다.

  • Fake - 실제로 작동하지만, 일반적으로 프로덕션에 적합하지 않게 만드는 지름길(shortcut)을 사용한다(ex InMemoryTestDatabase).

  • Stubs - 테스트 중에 나온 호출에 대한 미리 준비된 답변이다.

  • Spies - 호출 방법에 따라 일부 정보를 기록하는 스텁(stub)이다.

  • Mocks - 받을 것으로 예상된 답에 대해 예외와 함께 미리 프로그래밍 되어있다. 즉 테스트 결과로 받기를 기대하는 결과이다.

spec

테스트 파일을 작성하다보면, xxx.spec.ts 이런식으로 많이 작성한다. 보통 각 테스트 단위를 스펙(spec, specification)이라고 하는 것에서 가져온 것이다.

Last updated