티스토리 뷰

 

TDD (Test Driven Development) : 테스트 주도 개발

- 기술이 아니라 습관

- 모든 개발 과정을 테스트 중심으로 진행해나가는 습관

 

순서

1. 테스트 작성

- 만들려는 대상이 무엇인지 선언하고, 그 대상이 테스트에서 어떻게 작동해야 할지 기술

2. 테스트를 실행하되, 실패한다

3. 테스트를 통과하기 위해 필요한 최소한의 코드를 작성하여 성공한다

- 테스트 범위를 벗어나는 코드는 추가하지 않을것

4. 코드와 테스트를 함께 리팩토링 작업을 한다

- 리팩토링 작업 : 예외처리, 중복제거, 기능 추가 등

 

 


 

 

JavaScript에서 실행

 

Jest : 페이스북에서 사용되는 리액트 애플리케이션을 포함한 모든 자바스크립트 테스트 도구

- npm init 후 사용

npm install jest --save

 

- sum.js

function sum(a, b) {
    return a - b; // 실패 코드
    return a + b; // 성공 코드
}

module.exports = sum;

 

- sum.test.js

const sum = require('./sum');

test('1 + 2 = 3', () => {
    expect(sum(1, 2)).toBe(3);
})

it('calculates 1 + 2', () => {
    expect(sum(1, 2)).toBe(3);
})

- test( ) : 새로운 테스트 케이스를 만드는 함수

- it( ) : test( )와 똑같지만, 케이스 설명을 영어로 작성하게 되는 경우, "말이 되게" 작성 할 수 있음

- expect( ) : 특정 값을 예상하여 사전에 정의하고, 통과하면 성공시키고 통과하지 않으면 테스트를 실패시킴

- toBe(정한 값) : 특정 값이 내가 정한 값과 일치하는지 확인 해줌

 

- package.json : "scripts"를 다음과 같이 추가

{
  "name": "0902",
  "version": "1.0.0",
  "description": "",
  "main": "sum.js",
  "scripts": {
    "test": "jest --watchAll --verbose"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "jest": "^24.9.0"
  }
}

 

- 실행

npm test

-> 실패 했을 경우

 

-> 성공했을 경우

 

 


 

 

기능 추가

- sum.js

function sum(a, b) {
    return a + b;
}

function sumOf(numbers){
    let result = 0;
    numbers.forEach(n => {
        result += n;
    });
    return result;
}

// 내보내기
// module.exports = sum; 

// 각각 내보내기
exports.sum = sum;
exports.sumOf = sumOf;

 

-  sum.test.js

const { sum, sumOf } = require('./sum');

describe('sum', () => {
    it('calculates 1 + 2', () => {
        expect(sum(1, 2)).toBe(3);
    });

    it('calculates all numbers', () => {
        const array = [1, 2, 3, 4, 5];
        expect(sumOf(array)).toBe(15);
    })
})

- describe( ) : 여러 테스트 케이스를 묶어서 사용 가능

 

 


 

 

리팩토링

- 리팩토링 이후 코드가 제대로 작동하고 있는 것을 검증하기 매우 간편함

- sum.js

function sum(a, b) {
    return a + b;
}

function sumOf(numbers){
    // let result = 0;
    // numbers.forEach(n => {
    //     result += n;
    // });
    // return result;
    
    // 리팩토링
    return numbers.reduce((acc, cur) => acc + cur, 0);
}

// 내보내기
// module.exports = sum; 

// 각각 내보내기
exports.sum = sum;
exports.sumOf = sumOf;
댓글