본문 바로가기

Ect

TDD방법론 이란?

개발 관련 서치를 하거나 채용 사이트 개발자 공고에서 자격 요건으로 TDD방법론이라는 단어를 자주 보곤 한다.

나는 단순히 테스트 주도 개발 방법론이라고 간략한 뜻만 알고 있는 상태였기 때문에 좀 더 자세한 개념과 어떤 식으로 활용할 수 있는지 알아봐야겠다는 생각이 들었다.

 

 

테스트 주도 개발 TDD(Test Driven Development) 방법론은 소프트웨어 개발 방법론 중 하나로 개발자가 코드를 작성하기 전 테스트케이스를 작성한 후 코드 개발하여 리팩토링 하는 방법론이다.

 

TDD 방법론을 왜 사용할까?

1. 버그를 초기에 발견할 수 있다

개발 초기부터 테스트케이스를 작성하기 때문에 버그를 초기에 발견하여 바로 수정 가능하다. 따라서 나중에 크게 벌질 가능성이 있는 버그를 예방하기 때문에 소프트웨어의 안전성과 신뢰성을 향상한다.

2. 문서화할 수 있다

테스트코드를 작성하기 때문에 코드의 동작을 문서화 할 수 있다. 문서화시킴으로써 코드를 작성하지 않은 다른 개발자들도 문서화된 테스트 코드를 통해 의도 및 동작을 이해 할 수 있다.

3. 코드 품질 및 개발 생산성이 향상된다

코드 테스트가 가능하기 때문에 코드의 구조 개선하여 더 좋은 품질로 향상한다. 또한 초기에 테스트를 작성함으로써 가능의 동작을 명확히 이해하게 되어 개발의 생산성을 향상할 수 있다.

4. 설계를 개선시킨다

작은 단위로 나누어 작성하도록 유도하기 때문에 모듈화가 잘 이루어져 의존성이 줄어들어 소프트웨어 설계를 개선한다.

5. 리팩토링에 용이하다

작은 단위로 나누어 테스트 후 리팩토링 하는 단계를 가지기 때문에 유지보수 및 리팩토링 과정에 용이하다.

 

주요 테스트 프레임워크

1. Jest(JavaScript, TypeScript, React, Node.js)

Facebook에서 개발된 테스트 프레임워크로 Snapshot 테스트, 모킹 및 스파이 기능, 자동 모의 객체 생성등을 지원

2. Mocha(JavaScript, Node.js)

간결한 구문과 다양한 라이브러리를 사용 가능. 다양한 환경에서  테스트 가능, 커스텀에 용이

3. React Testing Library(React)

리액트 컴포넌트의 사용제 시점에서 테스트 작성하기 위한 도구. 실제 사용자 경험과 가까운 테스트를 작성하도록 유도하기 때문에 동작을 실제환경과 유사하게 확인 가능

4. Enzyme(React)

리액트 컴포넌트의 내부 상태나 라이프사이클 메서드 등을 자세하게 테스트 가능. 컴포넌트의 구조적인 테스트에 유용.

5. Cypress(JavaScript)

E2E 테스트(개발물을 사용자 관점에서 테스트하는 방법) 위한 프레임워크로, 브라우저에서의 사용지 경험 테스트 가능. 실제 사용자의 상호작용을 시뮬레이션하고, 디버깅 및 테스트 실행을 위한 도구를 제공

6. PHPUnit(PHP)

PHP 개발자들이 주로 사용하며 단위 테스트와 모의 객체 지원 제공

7. PyTest(Python)

다양한 테스트 스타일을 지원하며 간단한 문법으로 테스트 코드 작성 가능

8. JUnit(Java)

단위 테스트 작성 및 실행을 도와줌

9. RSpec(Ruby)

루비용 BDD(행위 주도 개발) 스타일의 테스트 프레임워크. 자연어에 가까운 문법으로 테스트 스펙 작성 가능

10. NUnit(.Net)

.NET 프레임워크를 위한 테스트 프레임쿼크로, C#개발자들이 주로 사용

 

Jest 프레임워크를 사용하여 간단한 테스트 케이스 작성하기

1. package.json 파일 만들어 npm 환경 잡기

npm init -y

작성할 프로젝트 폴더에서 init 한다.

2. 프로젝트 폴더에서 jest 설치하기

npm install jest

3. package.json의  "scripts"에 있는 "test"를 "jest"로 변경하기

 "scripts": {
    "test": "jest"
  },

변경함으로써 터미널에 npm test 입력 시 바로 테스트 가능하다. 

4. 테스트할 코드 작성

// math.js

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

module.exports = { add };

나는 간단히 테스트해 보기 위해 프로젝트 폴더에 math.js파일 생성 후 위와 같이 코드를 작성했다.

5. 테스트 케이스 작성

// test/math.test.js 

const { add } = require('../math.js');

test('1더하기 2는 3', () => {
  expect(add(1, 2)).toBe(3);
})

프로젝트 폴더에서 test 폴더 생성 후 테스트케이스 작성하기 위한 math.test.js 파일을 생성하여 위와 같이 코드를 작성했다.

6. 테스트해보기 

npm test

터미널에 npm test 입력 시 테스트가 가능하다

7. 결과