TDD(Test Driven Development) 란 (1)

아래 내용은 ‘테스트 주도 개발: TDD 실천법과 도구’(https://repo.yona.io/doortts/blog/issue/1)를 보고 주요 내용을 개인적으로 정리하여 작성했습니다.

TDD ?


테스트 주도 개발의 줄임말이다. 빠른 개발을 진행하며 매번 해야지만 생각하고 막상 실천하지는 못했다. 테스트 주도 개발이 뭘까? 말 그래도 해석해보자면 테스트를 우선시 하는 개발이라고 할 수 있다. ‘그래서 그게 도대체 무슨말인데..’

자바를 예로 들면 일반적으로 클래스를 생성하고 프로퍼티와 메소드를 생성하고 코드를 실행한다. 그리고 콘솔이나 다른 방법으로 해당 코드가 잘 실행이 되었는지 눈으로 확인한다. 테스트 주도 개발은 조금 다르다. 가장 큰 차이점은 코드를 작성하기전에 테스트 코드를 먼저 작성한다는 것이다.

테스트 코드를 먼저 작성한다는게 무슨 의미를 가질까?

좀 더 깔끔하고 단단한 코드를 작성하게 되는 밑거름이 될 수 있다. 그렇다고 테스트 코드를 먼저 작성하지 않고 작성한 코드가 잘못 됬다는 것은 아니다. 다만 테스트 코드를 먼저 작성함으로써 오는 이점이 조금 더 크다는 점이다. 그렇다면 테스트 코드를 작성하면 얻는 이점이 뭐가 있으며 또 단점은 뭐가 있을까?


TDD 장단점?


TDD 의 장점은 위에 언급 했었던 깔끔하고 단단한 코드를 만들 수 있다는 점이다. 또한 개발 코드의 수정 후 QA 및 기타 테스트를 수행하는 과정에서 유지보수가 용이하다는 점이다.

예를들어보자. 결제 프로젝트에서 결제 실행 코드 부분을 조금 수정했다고 하자. 코드 수정이 끝난 후에는 다시 테스트가 진행되어야 한다. 이때 수정된 부분에서만 테스트가 진행되는게 아니라 수정된 부분과 연결된 기존의 실행 과정 자체도 테스트가 되어야 한다. 만약 수정된 부분이 다른 코드와 종속적인 관계에 있다면 또 그 부분에서 오류가 발생한다면 과연 빠르게 찾아 낼 수 있을까? 확실하게 찾아낼 수 있을까? 여기서 테스트 코드의 장점이 발휘된다.

개발자는 수정된 코드를 테스트 하기 위해 기존의 테스트 코드를 실행한다. 테스트 코드가 전체 완료되면 성공인 것이고, 실패 되는 부분이 있으면 그곳을 다시 확인하면된다. 즉, 프로젝트의 유지보수에 용이하다.

또한 테스트 코드는 시나리오를 바탕으로 작성하게 되는데, 이는 추후 인수인계 및 코드 설명에서 유용한 자료가 된다. 잘 짜여진 테스트 시나리오는 다른 개발자들에게 좋은 매뉴얼이 될 수 있다. 많은 양이 작성된 코드를 여기저기 찾아가며 따라가는것이 빠를 것 같은가? 아니면 누군가가 만들어놓은 매뉴얼을 따라가며 확인하는 것이 빠를 것 같은가?

마지막으로 소프트웨어 설계에 좋은 영향을 미친다. 예를들어 클래스를 하나 설계할때도 변수 명, 메소드 명, 파라미터, Arguments 등에서 다시한번보게 되고 더 깔끔하게 작성되도록 도와준다.

이외에도 여러 장점이 있을것이다. 다음은 단점을 꼽아야 하는데 사실 단점이라고 할게 개인적으로 일정이 짧은 프로젝트에서는 많은 시간을 할당하기 어렵다는 점? 뿐이다. 하지만 이정도의 작은 단점으로 위에서 말한 큰 장점들을 포기하기엔 아쉽다.


TDD 작성 방법


TDD 의 작성방법은 큰 틀에서 다음과 같다. 먼저 시나리오를 하나 선택한다. QA 및 기획팀에서 만들어 놓은 시나리오가 있으면 그걸 따라가면 된다. 하지만 그렇지 않다면 개발자가 스스로의 테스트 시나리오를 작성해야 한다.

시나리오를 하나 선택했으면 그 시나리오에 대한 결과를 작성한다. 결과는 성공 또는 실패가 될 수 있다. 아니면 테스트 코드 자체의 오류가 될 수 있다. 가급적 오류는 만들지 않도록 작성하자.

결과의 성공은 선택한 시나리오가 맞는 값, 의도된, 예측된 값등을 출력했다는 것을 의미하고, 실패는 맞지 않는, 의도하지 않은 값, 예측에 실패 한 값등이 될 것이다.

끝으로 리팩토링이 있다. 시나리오를 선택하고 결과값을 판단하는 코드를 만들었다면 이를 바탕으로 개발 코드를 리팩토링해야 한다.



TDD 는 개념이다. 어떤 프레임워크나 라이브러리를 사용하는 특정 기술이 아니라. 해당 기술을 부수적으로 사용하는 소프트웨어 설계 개념이라고 생각한다.

태그:

카테고리:

업데이트:

댓글남기기