ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js - Mocha
    Node.js 2018. 8. 13. 18:09




    - TDD & BDD



    Mocha 를 먼저 얘기하기전에 TDD 와 BDD 에 대한 개념이 먼저 잡혀야 될꺼같애서 공부해보았다.


    먼저 TDD(Test-driven-development) 


    TDD 의 정의를 5단계로 나누어볼수 있다.


    1. 먼저 개발자는 몇 가지 테스트를 작성한다. - Add Tests 
    2. 개발자는 그런 테스트를 실행하고 실제로 테스트할 구현된 기능이 없으므로 당연히 실패한다. - See Tests Fall
    3. 다음으로 개발자는 코드에서 이러한 테스트를 실제로 구현한다. - Write Code
    4. 개발자가 코드를 잘 작성하면 다음 단계에서 테스트가 통과하는 것을 볼수 있다. - Run Tests
    5. 개발자는 새로운 코드가 무언가를 망치면 테스트가 실패할 것이라는 것을 알고 있기 때문에 원하는대로 코드를 리펙토링하고 주석을 추가하고 정리할수 있다. - Refactor



    테스트 코드를 작성하고 테스트로 검증된 코드를 가지고 실제코드를 작성하자는 TDD

    즉 먼저 개발을 하고 테스트를 하자는 기존의 방식이 아닌 테스트 코드를 작성하고 검증된 코드를 실제 코드로 반영하자는 개념을 가지고 있다.


    BDD(Behavior-driven development)


    TDD 와 유사한 방식이지만 BDD의 아버지 Dan north 은 이렇게 말했다고 한다.

    '당신이 조그마한 개발팀에 있고 당신과 일하는 대상이 모두 개발자라면 그것이 궂이 BDD일 필요는 없다. 왜냐하면 BDD는 TDD 사용자들의 공식화된 좋은 습관들 위에 형성되었기 때문이다. 하지만 BDD는 개발자의 언어로 이루어진 TDD에 반해 테스트 시나리오를 읽는 대상이 좀더 넓혀진 개념이다'


    BDD 스타일 방식은 문장을 쉽게 가독할수 있게되었다. 즉 테스트를 문장과 같이 읽을수 있게 되었고 자연스럽게 좀더 포괄적으로 테스트를 할수 있다. 어떻게 보면 소프트웨어의 디자인을 하는데 좀더 도움을 줄수 있게 된다.


    - Mocha


    앞서 소개한 테스트의 접근방식인 TDD 와 BDD 를 모두 지원하고 있는 테스트 프레임워크이다.

    좀더 정확히 말해선 테스트 프레임워크 를 담는 인터페이스 같은 형태를 띄고 있는데 그러한 이유는 테스트를 검증하기 위한 Assertion 모듈을 포함하고 있지 않기 때문이다.

    Mocha는 자체적으로 Assertion을 지원하지 않기 때문에 어떤 Assertion 모듈을 가져다가 사용할수 있다.

    기본적으로 node에서 제공하는 assert 모듈이 있지만 요즘은 chai 라는 모듈을 많이 사용한다고 한다.


    - Mocha 설정


    설정하는 것부터 시작해서 하나씩 알아가보자.


    먼저 설치는


    mkdir mochaTest

    npm init -y

    npm install mocha --save-dev


    참고로 Mocha는 node.v6 부터 지원한다.

    mochaTest 디렉토리에 두개의 js파일을 만들자.

    하나는 구현기능을 위한 factory.js , 테스트를 위한 test.js


    factory.js


    module.exports=function(n){
    if(n<0) return NaN;
    if(n==0) return 1;

    return n * factory(n-1);
    }



    test.js - TDD 방식


    var expect = require('assert'),
    factory = require('./factory');

    suite('TDD Style',function() {
    suiteSetup(function() {
    console.log("suiteSetup");
    });

    setup(function() {
    console.log("setup");
    });

    suite('#test', function () {
    test('this is a test', function () {
    expect.equal(1, factory(0));
    console.log('suite');
    });
    })

    teardown(function() {
    console.log("teardown");
    });

    suiteTeardown(function() {
    console.log("suiteTeardown");
    });


    })


    console 출력 결과는 


    suiteSetup

    setup

    suite

    teardown

    suiteTeardown 순으로 출력이 되며 factory(0) 이 1을 반환하므로 equal 함수를 통해 pass 된것을 확인 할수 있다.


    만일 factory(-1)을 작성하고 테스팅하면


    AssertionError: 1 == NaN

    Expected :NaN

    Actual   :1


    -1을 NaN을 반환하고 1과 같지 않으니 error가 난것을 확인할 수 있다.


    test.js - BDD 방식


    describe('BDD Style',function(){
    before(function() {
    console.log('before');
    });

    beforeEach(function() {
    console.log('beforeEach');
    });

    describe('#test',function(){
    it('this is a test.',function(){
    expect.equal(1, factory(0));
    console.log('describe');
    })
    })

    afterEach(function() {
    console.log('afterEach');
    });

    after(function() {
    console.log('after');
    });

    })



    before

    beforeEach

    describe

    afterEach

    after 순으로 출력이 된것을 확인 할 수 있다.


    'Node.js' 카테고리의 다른 글

    Node.js - async/await  (0) 2018.08.31
    Node.js - Promise  (0) 2018.08.15
    Node.js - Webpack  (0) 2018.08.09
    Node.js - Babel  (0) 2018.08.07
    Node.js[2] - Event Loop, 주의사항  (0) 2018.04.01
Designed by Tistory.