TDD 개발 방법론?
테스트 주도 개발 방법은, 기능 단위마다 테스트케이스를 먼저 작성하고 이를 수정하는 방향으로 코드를 짜는 개발방법론을 말한다.
테스트 주도 개발에서 사용하는 개발 순서는 다음과 같다.
Write Failing Test: 실패하는 테스트 코드를 먼저 작성한다.
Make Test Pass: 테스트 코드를 성공시키기 위한 실제 코드를 작성한다.
Refactor: 중복 코드 제거, 일반화 등의 리팩토링을 수행한다.
테스트를 먼저 짜서 개발을 하게 될 경우 다음과 같은 이점을 갖는다.
1. 버그에 대응하는 간결한 코드를 짤 수 있다.
2. 개발 후 에러를 줄일 수 있다.
3. 단위 테스트를 끝낸 코드이기 때문에, 오류에 대한 리포트가 충분하고 향후 유지보수가 용이하다
느낀점,,,
TDD 개발 방법론에 관해 학습하면서, 지금의 나에게는 크게 와닿지는 않았다. (당장 기능이 돌아가는 코드를 짜는 것 조차 벅차기 때문;;;)
그러나 통상적으로 개발에서 사용되는 코드를 원활하게 작성할 수 있는 시점이 된다면 상당히 무게를 두고 돌아볼 내용인 것 같다.
나아가, 방법론에서 제시하는 기준 자체는 굉장히 단순하기 때문에 TDD 개발이론에 관해 깊이 고민하는 것보다 실제 테스트 케이스를 많이 작성해보고 이를 피드백을 많이 받아보는 것이 중요하다는 생각이 들었다.
다음은 간단하게 테스트 케이스를 개발하는 서드파티 프로그램들을 살펴보고자 한다.
자바스크립트 테스트 : Mocha & Chai
Mocha 테스트 프레임워크와 와 Chai 어서션(Assertion) 라이브러리는 통상적으로 함께 사용하는 서드파티 프로그램이다.
* 어서션(Assetion) 라이브러리 : 테스트 코드에서 예상한 결고와 실제 결과를 비교하여 테스트를 판단해주는 라이브러리이다.
일단 서드파티 앱이기 때문에, npm을 활용하여 Mocha와 chai를 설치해주어야 한다.
npm install mocha chai --save-dev
Mocha의 대표 문법 : describe & it
mocha로 자바스크립트 테스트 케이스를 만들때는 2가지 대표적인 문법을 활용하게 된다.
해당 문법들을 다음의 간단한 예제로 살펴보고자 한다.
function isEven (num) {
if (num % 2 === 0) {
return true
} else {
return false
}
}
isEven(22) // true
module.exports = { isEven };
describe() : 테스트 스위트(Test Suite)를 정의한다. 테스트 스위트는 내가 원하는 테스트가 배열을 활용한 것인지, 함수를 활용한 것인지 등 테스트 프레임워크가 정의한 범위 내에서 범위를 좁혀나가는 것이다. (보통 중첩해서 표현함으로 범위를 좁혀나갈 수 있다.)
const { isEven } = require('./app.js');
describe ("짝수인지 확인해봅시다!", function () {
// describe 함수는 테스트 스위트(범주)를 설정한다.
// 두번째 arg로 들어오는 함수 내부에서 동작하는 함수가 실제 테스트 되는 함수가 된다.
})
it() : 개별 테스트 스위트를 정의한다. 만약, describe 함수로 테스트 범위를 함수 => js파일 내의 특정 함수로 범위를 좁혔다면, it 함수는 실제 값을 넣어보고 테스트 케이스를 통과하는지 여부를 반환하는 함수이다.
const { isEven } = require('./app.js');
describe ("Mocha Test!", function () {
it("짝수인지 확인하는 함수를 작성하세요.", function () {
// 이 부분에 chai 라이브러리를 사용한다!
})
})
Chai의 대표 문법 : should / expect
Chai 라이브러리는 mocha 테스트 프레임워크와 함께 사용했을 때, 더욱 쉽고 가독성있게 테스트를 할 수 있도록 돕는 라이브러리이다.
Chai의 대표문법인 should와 expect를 사용해서 표현한 mocha 테스트는 다음과 같다.
shoud.equal([테스트하고자 하는 함수(인자)], [결과])
expect([테스트하고자 하는 함수(인자)]).to.equal([결과])
const { isEven } = require('./app.js');
describe ("Mocha Test!", function () {
expect = chai.expect() // expect를 chai라이브러리에서 가져온 함수로 쓰겠다는 구문
should = chai.should() // should를 chai라이브러리에서 가져온 함수로 쓰겠다는 구문
it("짝수인지 확인하는 함수를 작성하세요.", function () {
// 짝수를 인자로 전달했을 때, true를 반환하는지 테스트
expect(isEven(2)).to.equal(true);
// 홀수를 인자로 전달했을 때, false를 반환하는지 테스트
expect(isEven(3)).to.equal(false);
// 0을 인자로 전달했을 때, false를 반환하는지 테스트
should.equal(isEven(0), false);
// 음수를 인자로 전달했을 때, 예외를 던지는지 테스트
expect(() => isEven(-1)).to.throw();
})
})
'개발이론' 카테고리의 다른 글
모던 개발 프로세스와 CI/CD 파이프라인 (개요) (0) | 2023.04.03 |
---|---|
Optimization(최적화) (0) | 2023.03.30 |