2019-06-24 Mocha적용(1)

NodeJS에서 Test Code를 작성하기 위해서 JS 테스트 프레임워크들을 조사하고 적용을 해보았다.

Jasmine vs Jest vs Mocha

Jasmine

  • Jasmine은 DOM, 브라우저에 의존하지 않는다. 웹사이트 Node환경에 딱 맞춰져 있다.

Jest

  • facebook에서 만든 TestFramework로서 Zero-Configuration 철학으로 설정없는 테스트 환경을 제공한다.
  • Jasmine의 최상위 Multiple-Layer를 제공한다.

Mocha

  • Runner를 포함하고 있는 테스트프레임워크a
  • NodeJS와 브라우저에서 테스트가 가능
  • 비동기 테스스 가능
  • 후커를 사용해서 테스트 before, after를 설정할 수 있다.

Mocah 사용하기

$npm install -g mocha
$npm install mocha --save-dev

// package.json
{
	'script' : {
    	'test': 'mocha'
    }
}
  • mocha는 describe(), it()으로 테스트 스위트와 유닛테스트를 정의하고 실행
  • mocha는 BDD스타일을 기본으로 한다. 하지만 TDD스타일도 지원한다.

BDD vs TDD

  • BDD : Behavior-Driven Development
  • TDD : Test-Driven Development
  • TDD는 테스트 자체에 집중을 하고, BDD는 비즈니스 요구사항에 집중하여 테스트 케이스를 작성한다.
// /test/test.js
const assert = require('assert');

describe('#Hello World!', () => {
  it('입력 값은 Hello World!', () => {
    const input = 'Hello World!';
    // 입력값이라고 가정
    assert.equal('Hello World!', input);
  });
  describe('#String test', () => {
    it('Hello의 문자 개수는 5', () => {
      const str = 'Hello';
      if (str.length === 5) {
        assert.ok(true);
      } else {
        assert.ok(false);
      }
    });
    it('World는 W 대문자', () => {
      const str = 'World';
      if (str.indexOf('w') > -1) {
        assert.ok(true);
      } else {
        assert.ok(false);
      };
    });
  });
});


// result


  #Hello World!
    ✓ 입력 값은 Hello World!
    #String test
      ✓ Hello의 문자 개수는 5
      1) World는 W 대문자


  2 passing (22ms)
  1 failing

  1) #Hello World!
       #String test
         World는 W 대문자:

      AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:

  assert.ok(false)

      + expected - actual

      -false
      +true

      at Context.it (test/test.js:23:16)



  • NodeJS에 내장된 Assert library를 사용하있지만 Mocha는 외부 Assertion library와 같이 사용할 수 있다.

shoud.js : BDD스타일의 Assertion expects.js : expect() 스타일의 Assertion chai - expect(), assert() 스타일

$mocha


//result
  #Hello World!
    ✓ 입력 값은 Hello World!


  1 passing (5ms)

  • mocha 명령어를 통해 테스트를 실행시킨다.
  • mocah 명령어를 통해 실행시키면 위와 같은 결과로 테스트가 통과했다고 나온다.
  • #Hello Wolrd!의 테스트 스위트는 #String Test라는 테스트 스위트를 가지고 있다. #String Test는 두개의 it()을 가질 수 있는 것을 볼 수 있다.

npm으로 실행하기

{
  //...

  "scripts": {
    "test": "mocha test"
  }

  //...
}
  • packge.json파일을 통해 npm test로 테스트를 실행하도록 할 수 있다.

package.json

  • express를 사용하면서 package.json과 npm명령어를 사용하면서 잘 모르는 문제들이 생겼다. 예를들면 npm install –save-dev라던지, npm install -g나 package.json에 있는 dependencies와 devDependencies의 차이 등등
  • package.json의 가장중요한 부분은 name, version이다. name, version을 통해 패키지의 고유성을 판별하게 된다.

name rules

  • name은 반드시 214자보다 짧아야한다.
  • 대문자 포함X, 점(.), 밑줄(_)로 시작할 수 없다.
  • named은 URL의 일부분이자, 커맨드라인의 인수이고 폴더명이다. 따라서 모든 URL-safe하지 않은 name은 거부된다.

dependencies

  • 테스트 관련 모듈이나 트랜스 파일러 관련 모듈은 dependencies에 추가하면 안된다. 운영이 아닌 개발단계에서만 필요한 의존성 모듈들은 devDependencies에 설치해야한다.
"dependencies": {
    "foo": "1.0.0 - 2.9999.9999",
    "bar": ">=1.0.2 <2.1.2",
    "baz": ">1.0.2 <=2.3.4",
    "boo": "2.0.1",
    "qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
    "asd": "http://asdf.com/asdf.tar.gz",
    "til": "~1.2",
    "elf": "~1.2.3",
    "two": "2.x",
    "thr": "3.3.x",
    "lat": "latest",
    "dyl": "file:../dyl"
}
  • version : 명시한 version과 일치
  • >version : 명시한 버전보다 높아야한다.
  • ~version : 명시한 버전과 근사한 버전
  • ^version : 명시한 버전과 호환되는 것.
npm WARN bootstrap@4.3.1 requires a peer of jquery@1.9.1 - 3 but none is installed. You must install peer dependencies yourself.
npm WARN bootstrap@4.3.1 requires a peer of popper.js@^1.14.7 but none is installed. You must install peer dependencies yourself.
npm WARN mongoose-auto-increment@5.0.1 requires a peer of mongoose@^4.1.12 but none is installed. You must install peer dependencies yourself.

  • npm 디펜던시 에러가 발생을 했다. mongoose-auto-increment를 사용하기 위해 mongoose의 버전을 맞췄다.

오늘의 느낀점

Java를 할때는 Junit을 이용하고 RestTemplate을 이용해서 유닛테스트와 통합테스트를 했었는데, JS를 하면서 테스트 코드를 작성안해서 아쉬운 부분이 있었다. Express를 하면서 테스트코드를 작성해보았다. JS사용하면서 리턴타입을 명확히 하지 못한 부분이 있었는데, 그 부분을 다시 리팩토링해보아야 겠다.

Written on June 24, 2019