1/21/2009

[TDD] 사용하자 마자 Cfix가 도움을 줬다.

앞에 소개한 xUnit 테스트 프레임워크인 cfix 사용법은 무척 간단합니다. 그냥 기존 비쥬얼 스튜디오 솔루션에 cfix 헤더와 라이브러리를 포함시키고 테스트 API를 써서 테스트 루틴을 작성한 후에 컴파일만 하면 됩니다. 물론 바이너리는 dll형태가 되어야 합니다. 그리고 나서 cfix32.exe 등을 사용하여 해당 dll을 로딩해 주면 cfix가 알아서 export된 테스트 루틴들을 순차적으로 수행합니다. 물론 ASSERT문에 걸리면 "Failure"를 출력해 주지요.
오늘 이 프레임 워크를 사용해서 우리 제품에 몇년동안 꼭꼭 숨어 있던 아주 짜증 나던 버그를 하나 잡아 내었습니다. 패킷 프로세싱 루틴의 버퍼 관리 문제였는데, 방대한 코드의 어느 부분이 문제인지 도저히 엄두가 안났고, 패킷을 매번 네트워크로 리플레이 해보고, 특정 트래픽을 발생시키는 테스트가 용이하지 않았다라는 점, 그리고 해당 문제의 출현 빈도가 높지 않았다라는 점으로 인해서 거의 몇년간 방치되고 처리 되지 않던 버그의 하나였습니다.
cfix가 도와준 부분은 기존의 패킷 프로세싱 루틴 중에 어떤 부분이 제대로 동작하는 지를 걸러 주는 역할이었습니다. 복잡한 코드의 해당 루틴이 제대로 작동한다는 확신을 갖게 되자 그러면 이 부분이 문제인가 하고 테스트가 이뤄지지 않은 코드를 보다가 버그가 있다라는 사실을 인지하게 되었습니다. 결국 cfix가 버그 박멸을 도와준 셈이지요.
패킷 처리 테스팅을 위해서 문제를 일으키는 샘플 트래픽 파일(pcap포맷)을 Wireshark으로 열어 해당 데이타 부분을 헥스값으로 카피해서 C 배열로 만들어서 Input으로 집어 넣어 주었습니다.
이 과정에서 가장 어려운 점은 유닛 테스팅을 염두에 두지 않고 설계된 6년이나 된 레거시 코드에 어떻게 유닛 테스팅을 적용하느냐였습니다. 결국 소스 코드에 "#ifdef"로 유닛 테스트일 때에는 하부의 의존성이 있는 루틴들을 부르지 않게 하는 식으로 처리하였습니다. 레거시 코드에 대한 유닛 테스팅도 잘 생각해 보면 여러가지 아이디어가 있을 것 같습니다.
덕분에 몇년 묵은 "쥐새끼" 같은 버그 한마리 소탕을 완료하였네요.

기쁩니다. ^^

Posted via email from bugtruck's posterous

댓글 1개:

  1. 우연히 cfix을 matt님을 통해서 알게 되었네요.
    한번 써봐야겠어요.. ㅎㅎ
    감사합니다

    답글삭제