티스토리 뷰

TDD, BDD 그리고 Mocha.js

pilot376 2013. 7. 21. 01:34

TDD, BDD

 

TDD(test-driven development) - 테스트 주도 개발

테스트 주도 개발(test-driven development, TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다. 개발자는 우선 자동화된 테스트 케이스를 작성하고, 그 케이스를 통과하기 위한 최소한의 코드를 생성, 리팩토링 하는 개발 사이클을 가진다. 테스트를 최우선으로 "작동하는 깔끔한 코드(clean code that works)"를 만드는 것이 테스트 주도 개발의 궁극적인 목표이다.

 

TDD 사이클

  • red : 실패하는 작은 테스트를 작성한다.
  • green : 테스트를 통과하는 코드를 작성한다. (퀄리티보다는 일단 통과하는 것을 목표로 작성한다.)
  • refactoring : 테스트를 통과한 코드를 리팩토링 한다. (퀄리티가 떨어지는 코드를 이 단계에서 리팩토링 한다.)

 

BDD(behavior-driven development) - 행위 주도 개발

어디서부터 테스트를 시작할지, 어떤 것을 테스트하고 어떤 것은 하지 않을지, 한 번에 얼마만큼을 테스트할지, 테스트에 어떤 이름을 붙일지 그리고 테스트가 왜 실패했는지 등의 고민에 대한 해답으로 나온 접근 방법이다. 테스트 메소드의 이름을 "이 클래스가 어떤 행위를 해야 한다(should do something)" 라는 식의 문장으로 작성하여 행위를 위한 테스트에 집중하게 되고, 만약 이런 메소드에 어울리지 않는 테스트 코드를 작성하고 있다면 그것이 엉뚱한 테스트란 걸 알게 한다.

 

스토리 템플릿

  • [X]로 하여금 (As a)
  • [Z]를 얻게 하려고 (so that)
  • [Y]가 필요하다 (I want)

Y는 어떤 기능이고, Z는 그 기능에서 얻어지는 이득이거나 가치고, X는 득을 보게 되는 사람이거나 역할이다. 이것들의 장점은 그것을 처음 정의할 때에 스토리를 배포하는 것의 가치를 명확히 하도록 강제한다는 데 있다. 이 스토리를 통해 비지니스적 가치도 판단할 수 있다.

 

스토리 템플릿 예시)

제목 : 고객이 현금을 출금한다.

  • 고객으로 하여금
  • 은행에서 줄을 서지 않게 하려고,
  • ATM을 통한 현금 출금이 필요하다.

 

인수 조건 (acceptance criteria)

  • 조건을 주고, (Given)
  • 만일 사건이 발생했을 때, (When)
  • 그러면 어떤 일이 수행된다. (Then)

 

인수조건 시나리오 예시)

시나리오 : 계좌에 잔액이 있음

  • [조건] 계좌에 잔액이 있다.
  • [그리고] 카드가 유효하다.
  • [그리고] 출금기에 현금이 들어있다.
  • [만일] 고객이 현금을 요청하면,
  • [그러면] 계좌에 출금액을 기재한다.
  • [그러면] 현금을 출금한다.
  • [그러면] 카드가 반환된다.

 

자바스크립트 테스트 프레임워크 Mocha.js

모카는 node와 browser에서 구동되는 simple, flexible, fun한 자바스크립트 테스트 프레임워크이다. 모카는 테스트를 검증하기 위한 자체 Assertion을 지원하지는 않지만 어떤 Assertion 라이브러리라도 가져다가 사용할 수 있다. 모카 홈페이지에서는 대표적으로 should.js, expect.js, chai, better-assert를 소개하고 있다.

 

인터페이스

개발자는 BDD, TDD 그리고 그 외에 입맛에 맞는 인터페이스를 선택할 수 있다. (기본은 BDD이다.)

 

BDD

BDD 인터페이스는 describe(), it(), before(), after(), beforeEach(), afterEach()를 제공한다.

describe('Array', function(){
    before(function() {
        // excuted before test suite
    });
  
    after(function() {
        // excuted after test suite
    });
  
    beforeEach(function() {
        // excuted before every test
    });
  
    afterEach(function() {
        // excuted after every test
    });
 
    describe('#indexOf()', function(){
        it('should return -1 when not present', function(){
            [1,2,3].indexOf(4).should.equal(-1);
        });
    });
});

 

TDD

TDD 인터페이스는 suite(), test(), setup(), and teardown()를 제공한다.

suite('Array', function(){
    setup(function() {
        // excuted before every test 
    });
  
    teardown(function() {
        // excuted after every test 
    });
 
    suite('#indexOf()', function(){
        test('should return -1 when not present', function(){
            assert.equal(-1, [1,2,3].indexOf(4));
        });
    });
}); 

 

Browser support

브라우저에서는 mocha.js, mocha.css와 함께 Assertion 라이브러리를 include하여 사용할 수 있다.

<!doctype html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Example Mocha Test</title>
    <link rel="stylesheet" href="css/mocha.css">
</head>
<body>
 
    <!-- Required for browser reporter -->
    <div id="mocha"></div>
 
    <!-- mocha -->
    <script src="js/mocha.js"></script>
    <script>
        mocha.setup('bdd');
    </script>
 
    <!-- Include your assertion lib of choice -->
    <script src="js/expect.js"></script>
 
    <!-- Include anything you want to test -->
    <script src="../js/test-target.js"></script>
 
    <!-- Spec files -->
    <script src="spec/test-spec.js"></script>
 
    <!-- run mocha -->
    <script type="text/javascript">
        mocha.run();
    </script>
 
</body>
</html>

Browser support 예제 다운로드

mocha example.zip

 

참고


댓글