[테스트] Mocha

16766 단어 테스트테스트

테스트를 하는 이유

  1. 매번 어떠한 유스 케이스 경우마다 코드를 수동으로 '재실행'하면서 확인하는 것은 비효율 적이다.
  2. 항상 수많은 유스 케이스를 생각하면서 코드를 수정하는 것은 거의 불가능하다.

테스팅 자동화는 테스트 코드가 실제 동작에 관여하는 코드와 별개로 작성되었을 때 가능합니다.

Behavior Driven Development(행위주도개발)

BDD는 개발을 하기 전 명세서(스펙)을 먼저 작성하고 난 후에 구현을 하는 개발 방식입니다. 명세서(스펙)은 테스트를 위해 만들어진 산출물을 의미합니다. 스펙의 용도는 다음과 같습니다.
1. 테스트 – 함수가 의도하는 동작을 제대로 수행하고 있는지 보장함
2. 문서 – 함수가 어떤 동작을 수행하고 있는지 설명해줌. describe와 it에 설명이 들어감
3. 예시 – 실제 동작하는 예시를 이용해 함수를 어떻게 사용할 수 있는지 알려줌
구현이 종료된 시점에는 스펙과 코드 둘 다를 확보할 수 있습니다. BDD에서 아래는 pow함수에 대한 스펙이다.

describe("pow", function() {
  it("주어진 숫자의 n 제곱", function() {
    assert.equal(pow(2, 3), 8);
  });
});

describe("title", function() { ... })
테스트하고자 하는 기능에 대한 설명(ex, 함수명)과 테스트의 세부 내용들을 인자로 갖는다.

it("유스 케이스 설명", function() { ... })
특정 유스 케이스에 대한 설명과 실제 테스트 함수를 인자로 갖는다.

it 대신 it.only를 사용하면 원하는 테스트만 실행 가능

describe("TEST", function() {
  it("test1", function() {
    // code...
  });
  // Mocha는 아래 블록만 실행합니다.
  it.only("test2", function() {
    // code...
  });
  it("test3", function() {
    // code...
  });
});

assert.equal(value1, value2)
테스트과정에서 쓰이는 함수중 하나로 구현한 함수의 실행값과 기대값이 같은지 확인한다.

다양한 assertion

assert.isNaN(value) => NaN 확인
assert.equal(value1, value2) => value1 == value2 확인
assert.strictEqual(value1, value2) – value1 === value2 확인
assert.notEqual, assert.notStrictEqual – 비 동등성, 비 일치성 확인
assert.isTrue(value) – value === true 확인
assert.isFalse(value) – value === false 확인

개발 순서

  1. 명세서 초안 작성(+ 기본적인 테스트 포함)
  2. 코드 작성
  3. 테스트 프레임워크(ex, Mocha)를 통한 테스트 및 코드 수정
  4. 모든 테스트 통과
  5. 명세서에서 고려하지 못한 유스케이스 추가
  6. 3~5단계 반복

테스트 프레임워크

Mocha – 핵심 테스트 프레임워크로, describe, it과 같은 테스팅 함수와 테스트 실행 관련 주요 함수를 제공합니다.
Chai – 다양한 assertion을 제공해 주는 라이브러리입니다. (ex, assert.equal)
Sinon – 함수의 정보를 캐내는 데 사용되는 라이브러리로, 내장 함수 등을 모방합니다.

<!DOCTYPE html>
<html>
<head>
  <!-- 결과 출력에 사용되는 mocha css를 불러옵니다. -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.css">
  <!-- Mocha 프레임워크 코드 load -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.js"></script>
  <script>
    mocha.setup('bdd'); // 기본 셋업
  </script>
  <!-- chai 프레임워크 코드 load -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.js"></script>
  <script>
    // chai의 다양한 기능 중, assert를 전역에 선언합니다.
    let assert = chai.assert;
  </script>
</head>

<body>

  <script>
    // 실제 테스트할 코드 작성
    function pow(x, n) {
      // To Do ...
    }
  </script>

  <!-- 테스트(describe, it...)가 있는 스크립트를 불러옵니다. -->
  <script src="test.js"></script>

  <!-- Mocha 실행 결과가 출력됨 -->
  <div id="mocha"></div>

  <script>
    mocha.run(); // 테스트 실행
  </script>
</body>

</html>

before/afterbeforeEach/afterEach
before/after는 전체 테스트(describe)에 적용되는 것이고 beforeEach/afterEach는 단일 테스트(it)에 적용된다.

describe("test", function() {

  before(() => alert("테스트를 시작합니다 - 테스트가 시작되기 전"));
  after(() => alert("테스트를 종료합니다 - 테스트가 종료된 후"));

  beforeEach(() => alert("단일 테스트를 시작합니다 - 각 테스트 시작 전"));
  afterEach(() => alert("단일 테스트를 종료합니다 - 각 테스트 종료 후"));

  it('test 1', () => alert(1));
  it('test 2', () => alert(2));

});

보통 테스트 전 값을 초기화 하거나 테스트(테스트 그룹)가 바뀔 때마다 해줘야 하는 작업이 있을때 사용한다.(ex, 카운트 변수 0으로 설정)

테스트를 작성하려면 함수가 어떤 동작을 하는지, 입력값은 무엇이고 출력값은 무엇인지 정의하고 난 후에 구현을 시작합니다. 따라서 구현을 시작하는 순간부터 이미 좋은 아키텍처가 보장되고 일반적으로 개발 속도도 빨라지고 이전보다 코드를 더 안정적으로 작성할 수 있습니다.

좋은 웹페이지 즐겨찾기