안정적인 소프트웨어를 작성하는 2가지 방법 중 다른 하나


안정적인 소프트웨어를 작성하는 데는 여러 가지 고민해야 될 사항이 있겠지만,
그 중 딱 2가지만 고르라고 한다면,
하나는 '설계'를 그리고 다른 하나는 'Unit test'를 고를 것 같습니다.

그 두 번째, 'Unit test'에 대한 이야기 입니다.


저의 첫 module을 작성을 하던 때였습니다.
온 정성을 다해서 코드를 작성했습니다.
'버그가 없는 완벽한 코드를 작성할 테다!'

'완성!' 드디어 Integration시험이 시작됩니다.
그런데, 믿고 있던 제 module에서 버그가 발견되는 것이 아니겠습니까?
'하나쯤이야.'

시간이 흐르면서 버그는 계속 발견되었습니다.
게다가 이전에 잘 동작하는 것들이, 수정 후에 잘 동작하지 않는 버그도 만들어 냈죠.
'이런~ 자존심 상합니다'

'API의 argument를 그런 식으로 사용한단 말이야?'
'초기화 이전에 그 API가 불릴 수도 있구나'
'그 API들을 동시에 사용한다 말이지?'

API는 경험이 부족했던 제가 예상하기 힘든 방법으로 사용되었고,
'설마?' 했던 것들도 시간이 지나면서 버그로 나타났죠.
그 때부터 '어떻게 하면 이런 버그들을 만들지 않을 수 있을까?' 라는 고민을 시작한 것 같습니다.


찾은 답이 바로 'Unit Test' 입니다.
'Unit test'란 별 것 아닙니다.
Module의 API를 상상할 수 있는 모든 방법으로 시험하여 버그 없음을 확인하는 것이죠.

예를 들어, Argument가 하나 있고 그 범위가 1..100 이라면,
1을 주면 동작하는가? 100을 주면 동작하는가?
0을 주면 실패하는가? 101을 주면 실패하는가?
이런 식으로 시험을 하는 것입니다.


제가 배운 Point는 2가지인데,
첫 번째는 시험 자체가 '자동'이어야 한다는 것입니다.

버그를 수정하게 되면 이런 걱정을 합니다.
'다른 부분에는 영향이 없는 건가?'
관련 없는 부분인 것 같은데, 잘 돌던 코드가 안 도는 경우가 생기게 됩니다.
이때, 자동 Unit Test가 있으면, 코드를 마음 편히 고칠 수가 있게 되는 거죠.
버튼만 누르면 '성공' 이 표시가 되니까요.
코딩이 다시 재미있어집니다.

그런데, 이렇게 시험을 해도 버그는 발견됩니다.
이유는 간단하죠. 경험이 부족하다 보니, 정작 시험해야 할 경우를 빼먹으니까요.
이것이 두 번째 point입니다.
Unit Test는 'Upgrade' 되어야 합니다.
생각하지 못했던 경우가 생기면, 이를 추가하는 겁니다.
Code와 더불어 Unit Test도 계속 Upgrade되는 거죠.
이렇게 계속 추가하다 보면, 언젠가는 완벽에 가까운 Case를 가지게 되겠죠. 하하


결국, Unit test의 목적은 간단합니다.
'한번 만든 버그를, 두번 다시 만들지 말자'


여기까지가 제가 찾은 간단한 방법입니다.
효과는 어땠냐고요?
다행히도 현재는 상당히 적은 수의 버그가 발견되고 있으며,
팀원들의 대부분은 제가 코딩을 잘 하는 것으로 오해를 하죠.
Unit test에서 발견되는 수많은 버그를 모르니까요.

근데, 하나 좋지 않은 것도 있습니다.
코딩이 약간은 재미 없어진다는 거죠.
Module coding이 100 이라면
Unit test coding을 40~70 정도 하게 되니까요.

설계의 고통처럼,
코딩의 고통은 Unit test작성이 아닐까 합니다.

고맙습니다.


by 제임스 | 2009/04/05 23:37 | 메인스토리 | 트랙백(2) | 덧글(10)

트랙백 주소 : http://jamestic.egloos.com/tb/2282444
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from heartsavior'.. at 2009/05/14 14:01

제목 : Heart의 생각
안정적인 소프트웨어를 작성하는 2가지 방법 중 다른 하나 유닛 테스트에 대해 기억해야 할 두 가지… 시험 자체가 '자동' 이어야 한다, 유닛 테스트는 업그레이드 되어야 한다. 유닛 테스트 코드도 유지보수 대상인 것이다....more

Tracked from 청하는 애자일 개발자 at 2009/10/31 17:32

제목 : 다시 시작하는 테스트주도개발(Test Driven ..
켄트백의 "익스트림 프로그래밍 2/E"에 다음과 같은 글이 있다. 매일 나아지고 있는 똘망이 상황이 어떻건 간에 당신은 언제나 더 나아질 수 있습니다. No matter the circumstance you can always improve. 당신은 언제나 자기 자신부터 개선을 시작할 수 있습니다. You can always start improving with yourself. 당신은 언제나 오늘부터 개선을 시작할 수 있습니다. You can......more

Commented by coffeejava at 2009/04/06 02:10
reliability, safty ?
Commented by 제임스 at 2009/04/06 18:47
Reliability, that is.

오랜만입니다. coffeejava님 하하
Commented by 랩하는좀비 at 2009/04/06 12:35
Unit Test로 코딩을 하다보면 Test뿐만 아니라 개념이 확장되는 느낌을 받을 수 있더군요. -ㅅ-) TDD가 요즘에 트렌드인 듯 합니다. ...요즘이 아닌려나(...)

(링크만 해 놓은 눈팅족이지 말입니다)
Commented by 제임스 at 2009/04/06 18:59
그런 것 같아요. Test code를 작성하다 보면 개념이 깨끗해져서, 설계를 다시 돌아보다 잘못된 부분을 고치기도 하게 되는 것 같아요. 좀비님하고 말이 통하네요.
TDD, 트렌드, 이런 건 너무 어렵습니다. 하하
Commented by coffeejava at 2009/04/07 10:46
안녕하세요~
언제나 글은 재미 있게 읽고 있습니다. ^^
눈팅만 해서 오랫만이 됐나 봅니다~
Commented by 제임스 at 2009/04/08 09:53
하하 네 coffeejava님,
공부는 즐거우신지요.
지금도 그 용기가 부럽네요.
Commented by Keating at 2009/04/25 03:22
하지만 결국 데드라인의 압박으로 완벽이 아닌 만족의 수준에 머무는 소프트웨어들만 만들어질 뿐이라는 거
Commented by 제임스 at 2009/04/25 09:58
왠지 세상과 타협하는 것 같으면서도, 타협하지 않는 느낌이 오묘합니다. ^^
Keating님의 말씀만 들어도, 높은 기대치가 보이는 것 같아 훌륭한 엔지니어 일것 같다는 생각이 들어 좋습니다.
Commented by 윤청하 at 2009/10/31 17:39
쉽게 어느 한순간에 완벽이 될순 없을겁니다.
지금 프로젝트에서 테스트 커버리지가 20%였다면 다음에는 30%로 올릴수 있다고 생각합니다. 결국 부단한 노력이 쌓인다면 완벽에 가까워지지 않을까요?^^
좋은 글 감사합니다.~ (늦은 댓글입니다;;)
Commented by 제임스 at 2009/11/02 09:47
sozu님이시군요. TDD에 심취해 있으시군요.
새로운 것은 도전하시는 모습이 좋습니다.
그러게요.
component의 경우에는 coverage가 70~80%는 되는 것 같은데,
Integrated 된 후의 test coverage는 10% 미만인 것 같아서
참 어렵다고 생각하고 고민 중이랍니다.
계속 노력하다 보면 좀 좋아지겠죠?
고맙습니다.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶