본문 바로가기

Coding Skill

[TDD] 테스트 주도 개발

[해당 포스트는 개인적으로 공부를 하고 차후에 참고용으로 하고자 작성한 것입니다.
따라서 잘못된 부분이나 부족한 부분이 있을 수 있기에 참고하시기 바랍니다.]

테스트 주도 개발이란, 테스트가 개발을 이끌어 나가는 것으로 먼저 만들고 테스트를 통과하기 위해 짜는 것을 말한다.

 

- 고전적인 방법을 통해 개발 후 추가기능이 생겼을 때의 문제점

  1. 특정 모듈의 개발 기간이 길어질수록 개발자의 목표의식이 흐려진다.
  2. 작업 분량이 늘어날수록 확인이 어려워진다.
  3. 개발자의 집중력이 필요해진다.
  4. 논리적인 오류를 찾기가 어렵다.
  5. 코드 수정시에 기존 코드의 정상 동작에 대한 보장이 어렵다.

- TDD의 목표

TDD 방식을 통해 얻고자 하는 최종 목적은 '작 동작하는 깔끔한 코드'

결정과 피드백 사이의 갭을 조절하기 위한 테크닉

-> TDD에서 개발자는 자신이 작성한 프로그램에 대해 메서드 혹은 함수 단위류 테스트를 수행하며, 이는 결과적으로 이후에 발생하는 테스트 단계에서의 결함 발생 비용을 줄인다.

 

- TDD 방법

  1. 질문 - 작성하고자하는 메서드가 어떻게 동작되는지 생각하고, 이를 List에 정리한다.
  2. 실행 - 무조건 컴파일은 되지만, 실패하는 프로그램을 작성하여 확인한다.
  3. 정제 - 실패한 코드를 성공시키도록 변형한다. 추가적으로 Refactoring을 하여 코드를 깔끔하게 만든다.

출처: TDD 실천법과 도구

 

- TDD는 어떤 상황에서 하나?

* 만약 어떤 부분에 대한 코딩을 여러 번 해봤고 결과가 어떻게 나올지 알고 있다면 굳이 TDD를 사용하지 않아도 된다.

  1. 처음 해보는 프로그램 주제
  2. 고객의 요구조건이 바뀔 수 있는 프로젝트
  3. 개발하는 중에 코드를 많이 바꿔야 된다고 생각하는 경우
  4. 본인이 개발하고 나서 해당 코드를 누가 유지보수를 할지 모르는 경우

- TDD의 장점

  1. 개발의 방향을 잃지 않게 유지해준다.
    • 현재 자신이 어떤 기능을 개발하고 있고, 또 어디까지 와 있는지를 살펴볼 수 있다.
  2. 품질 높은 SW 모듈 보유가가 가능하다.
    • Application은 필요한 만큼 테스트를 거친 '품질이 검증된 부품'을 갖게 된다.
  3. 자동화된 단위 테스트 케이스를 갖게 된다.
    • TDD의 부산물로 나오는 자동화된 단위 테스트 케이스들은, 개발자가 필요한 시점에 언제든지 수행해볼 수 있다.
  4. 사용설명서 & 의사소통의 수단이 된다.
    • TDD를 통해 작성된 테스트 케이스는 사용 설명서이자, 그와 동시에 다른 개발자와 소통하는 커뮤니케이션 통로가 된다.

- TDD의 단점

TDD를 사용하면, 사용하지 않았을 때에 비해 약 개발 시간이 10~30%가량 늘어난다.

 

테스트하기 쉬운 코드로 TDD 하기

- 테스트하기 쉬운 코드란?

같은 입력에 항상 같은 결과를 반환하는 코드 (Deterministic)

예로 들자면, 덧셈을 하여 항상 정수를 반환하는 코드.

 

- 테스트하기 어려운 코드란?

  1. If ~ else 같이 분기가 되는 문법은 항상 같은 결과를 반환하지 않기 때문에 좋지 않음.
  2. DB에서 결과를 조회할 때, 항상 같은 결과를 반환하지 않기 때문에 좋지 않음.

- 테스트하기 쉬운 코드로 개발하기 (1) : 테스트하기 쉬운 코드와 어려운 코드를 분리시킨다.

  1. 테스트하기 쉬운 코드와 어려운 코드를 나눈 후 묶어 각각의 메서드로 만든다.
  2. 테스트하기 어려운 코드의 결과를 테스트하기 쉬운 코드의 메서드 인자로 넘겨 처리한다.

- 테스트하기 쉬운 코드로 개발하기 (2) : 두 부류의 코드는 최대한 분리시킨다.

 

초록색: 테스트하기 쉬운 코드, 빨간색: 테스트하기 어려운 코드

  1. 테스트하기 쉬운 코드는 서로 겹치되, 어려운 코드는 별도로 밖에서 처리하도록 한다.

만약 테스트하기 쉬운 코드가 존재하더라도, 테스트하기 어려운 코드가 들어가있거나 속해있으면 해당 메서드는 테스트하기 어려운 코드가 된다.

 

출처
1. TDD 실천법과 도구: https://repo.yona.io/doortts/blog/issue/1
2. TDD 개념 및 장단점: https://gmlwjd9405.github.io/2018/06/03/agile-tdd.html
3. 개발하기 쉬운 코드: https://www.youtube.com/watch?v=Cz_a2gQp63c

'Coding Skill' 카테고리의 다른 글

[Coding Skill] 변수 및 함수 명칭 작성 스타일  (0) 2019.08.30
[CodingSkill] GNU / K&R / BSD  (0) 2019.08.30