유돌이

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Notice

2008. 12. 20. 07:55 비법전수
 
출처 ${nathan.blogtitle} | 놀토
원문 http://blog.naver.com/comgot/100019068425
개발자를 위한 테스트 자동화 도구를 통해 품질을 향상시키자
 
[ 류한석(컬럼니스트) 2005/10/31]
 
소프트웨어 개발 프로젝트 환경에서 개발자가 책임져야 하는 범위는 어디까지 일까? 일부 매니저들은 프로젝트에 단지 개발자만 모아놓고 코딩을 시키면서 품질이 좋은 제품이 나오기를 기대한다. 품질에 대한 개념이 없는 것이다. 엔터프라이즈 개발에 있어 테스터는 반드시 필요한 역할이다.

개발자와 테스터의 역할은 구분되어야 한다. 이 말은 개발자가 테스트를 하지 않는다는 뜻이 아니다. 테스터는 애플리케이션 생애주기 관점에서 초기에 테스트 계획을 수립하고 지속적인 테스트를 수행하며, 개발자는 스스로 자신이 작성한 코드의 성능과 품질을 보장해야 한다. 개발자 수준의 테스트가 중요함에도 불구하고, 이전 버전의 Visual Studio에서는 개발자를 위한 테스트 도구가 부족하였기 때문에 외부 도구의 도움을 받을 수 밖에 없었다.

Visual Studio 2005는 IDE 내에 개발자를 지원하는 테스트 도구들을 포함하고 있다. 그러한 도구들을 통해 문제가 있거나 보안 이슈가 발생할 수 있는 코드를 찾아낼 수 있고, 그것은 소프트웨어 생애주기 전반에 걸쳐 결함율을 감소시키는데 유용한 역할을 한다. Visual Studio Team Edition for Software Developers는 개발자를 위해 다음과 같은 기능을 지원한다.

  • 스태틱 코드 분석: 매니지드 코드와 네이티브 코드를 모두 지원
  • 코드 프로파일링: 실행되는 쓰레드를 확인하거나, 오브젝트의 할당 및 생애주기를 확인보고, 스택 및 함수 실행 내역을 살펴본다.
  • 코드 커버리지: 얼마나 많은 코드가 테스트되고, 얼마나 잘 되었는지, 테스트가 안된 부분을 알려준다.
  • 유닛 테스트 및 프레임워크

    개발자를 위한, 코드 커버리지 기능

    위와 같은 테스트 관련 기능들이 Visual Studio 2005에서 제공되고 있으며 또한 중요한 부분이기는 하지만, 실제 프로젝트의 소프트웨어 개발 팀은 일정에 대한 압박이 심하기 때문에 충분한 테스트를 하지 못하는 경우가 많다.

    새로운 요구사항이 발생하거나 또는 수정됨으로 인하여, 코딩이 지연되고 그로 인해 초기에 계획된 테스트 일정을 제대로 지키지 못하는 경우가 비일비재하다. 더군다나 현업의 일부의 프로젝트에서는 아예 유닛 테스트를 수행하지 않거나 코드 커버리지가 사용되지 않는 경우도 많다.

    많은 개발자들이 소프트웨어 생애주기에 대한 개념 및 체계적인 개발과 테스트에 대한 지식이 부족한데, 왜냐하면 그것들을 학교 또는 학원에서 제대로 가르치지 않고 있으며 또한 (흥미 요소가 적은) 테스트에 대해 개발자 스스로 공부하는 경우도 별로 없기 때문이다.

    개발자를 위한, 유닛 테스트 기능

    하지만 고객에게 더 나은 품질의 소프트웨어를 제공하고 미래에 발생할 수 있는 문제점을 사전에 해결하기 위해서는, 개발자 수준의 코드 분석 및 유닛 테스트가 중요할 수 밖에 없다.

    그렇다고 해서 개발자가 모든 코드를 100% 테스트하는 것은 불가능하다. 물론 이론상으로는 가능할지 모르지만, (아주 간단한 코드를 제외하고) 현실적으로는 모든 로직 경로를 테스트하는 것은 불가능하다고 볼 수 있다.

    코드 커버리지 도구를 사용한다고 하더라도, 테스트 비율을 향상시킬 수 있을 뿐 100%의 테스트를 수행하는 것은 어렵다. 100% 테스트가 된 것처럼 보일지라도, 필요한 작업이 수행되기 위한 코드가 존재하지 않는 잠재 오류가 존재하고, 특정 조합의 로직 경로가 실행될 때에만 나타나는 오류도 존재하기 때문이다. 이러한 경우의 오류는 상당히 많은 편이고, 안타깝게도 도구를 통해 해결될 수 없는 것들이다.

    중요한 것은 여러 테스트 도구를 사용하여 테스트 비율을 높이고, 보다 나은 품질의 소프트웨어를 제공하려는 마인드와 노력일 것이다. 노력조차 하지 않는 개발자들이 많고, 그러한 소프트웨어에는 재앙의 그림자가 드리워져 있다.

    코드 품질 향상을 위한 개발자 지침
    필자가 생각하는 코드의 품질 향상을 위한 개발자 지침은 다음과 같다. 개발자는 코딩을 하는데 있어, 다음의 내용을 하나의 가이드로 삼을 수 있을 것이다.

    1. 무엇보다 처음에 잘하는 것이 가장 좋다. 아무리 시간이 부족해도, 처음에 애플리케이션 구조를 잘 설계하고, 제대로 고민하고 코드를 작성한다.
    2. 유닛 테스트 일정 및 코드 로직의 리뷰 일정을 개발 일정에 포함시킨다. 프로젝트 매니저가 전체 일정에 포함시키지 않았더라도, 개발자 스스로 주어진 일정 내에서 테스트 및 코드 로직 리뷰를 수행하도록 한다.
    3. 코드 분석 및 프로파일링, 코드 커버리지, 유닛 테스트 등 Visual Studio 2005의 테스트 도구를 이용하여 최대한 결함을 걸러낸다.
    4. 자동화된 도구를 통해 충분히 테스트를 하였고, 애플리케이션이 거의 모든 경우에 정상적으로 동작하는 것처럼 보일지라도, 집중하여 코드를 한 줄 한 줄 차근히 리뷰하는 것(Code Review 또는 Code Inspection)은 아주 중요하다. 그것은 잠재된 문제점을 찾아낼 수 있게 한다.

    마지막에 언급한 집중적인 코드 리뷰의 효과는 필자 또한 이미 많이 경험한 바 있다. 한가지 예를 들면, 10년 전 필자는 트랜잭션이 많기로 소문난 유통 업계에서 POS 시스템을 개발하였는데, 중요한 로직 상의 오류를 코드 리뷰를 통해 언제나 거의 깨끗하게 제거할 수 있었다.

    그로 인해 필자는 다른 개발자들과는 달리, 심각한 결함으로 인한 고객과의 문제를 한번도 발생시킨 적이 없었다. 로직 자체가 빠져 있거나 특정 조합에 의해서만 실행되는 로직 오류의 경우, 개발자의 정신 집중에 의한 코드 리뷰를 통해 사전에 분명히 찾아낼 수 있다. 그리고 그렇게 믿어야 한다.

    그러한 코드 리뷰 및 테스트 자동화 도구를 동시에 사용함으로써 보다 완벽한 품질의 소프트웨어를 고객에게 제공하고, 그것을 통해 진정한 개발의 맛을 음미해 보기 바란다. 결함 없는 소프트웨어를 만드는 기쁨은 정말 대단한 것이다. @

    필자 류한석님은 소프트웨어 개발 13년의 경력을 가진 Microsoft MVP (Solutions Architect), .NET Advisor, PMP이며, 아키텍처와 프로젝트 관리에 많은 관심을 갖고 있다. 또한 CISA, CISM이며 한국CISSP협회 연구이사로서, 개발 프로세스에서의 보안 고려사항에 대해서도 지속적으로 연구하고 있다.
  •  

    posted by 유돌이