인수 테스트
인수 테스트는 고객이 개발된 시스템을 최종 인수하기 전 제공된 기능과 성능이 고객의 요구사항과 일치하는지를 고객이 주관하여 최종으로
실행하는 것이다. 실제 사용자를 기준으로 테스트가 진행됨으로 비즈니스 측면의 테스트가 진행된다. 일반적으로 고객의 통합 테스트에 대한 참여를
통해 발생한 에러에 대한 수정, 보완 등이 끝난 것을 확인한 경우 인수 테스트를 대체하곤 한다.
현장 테스트
현장 테스트는 실제 사용자의 인프라 환경과 역할에 따른 사용방법 등을 고려하여 선정된 사용자들의 사업장에서 이루어지는 실전 테스트이다.
홈페이지 등 인터넷 환경에서 불특정다수가 사용하는 시스템인 경우는 PC방도 예외가 아니다. 다양한 PC, OS, 네트워크 환경 등 여러 조합에
대한 선정을 통해 최대한 현장의 목소리를 듣고자 하는 것이다.
성능 테스트
소프트웨어의 효율성(응답속도, 처리량, 처리속도)을 테스트하는 것으로서 볼륨 테스트나 스트레스 테스트와 병행하여 수행될 수도 있다. 다량의
데이터를 조회하거나 수정하는 중요 프로그램에 대해 테스트를 수행하고 응답속도를 측정한다.
1. 주요 대상
다량의 데이터를 편집하여 조회하는 중요 프로그램에 대해 테스트를 수행함
2.
수행절차
테스트에 필요한 데이터를 준비함
테이터를 편집/조회할 프로그램을 수행시켜 테스트를 수행함
볼륨 테스트
소프트웨어로 하여금 사용자가 요구한 만큼의 데이터 처리가 가능한 지를 테스트하는 것이다.
1. 주요 대상
중요 마스터 데이터에 대해서는 테스트를 수행함
다량의 데이터가 조회되거나 업데이트되는
화면으로 테스트를 수행함
볼륨 테스트에는 매우 많은 비용이 필요하므로 필요 이상으로 과다한 테스트가 되지 않도록 시스템의 특성을 잘
고려하여 수행해야 함
2. 수행절차
볼륨 테스트의 대상이 되는 테이타베이스에 사용자가 요구한 만큼의 데이터를
임의로 준비함
해당 테이터를 입력, 또는 배치로 생성하는 애플리케이션을 수행하여 데이터의 정상처리 여부를 테스트함
스트레스 테스트
소프트웨어에 다양한 스트레스를 가해봄으로써 짧은 시간 동안에 많은 양의 데이터를 처리할 수 있는지를 테스트하는 것이다. 또한 분산처리 시
시스템 구성요소별로 스트레스가 적절히 분배되는지를 테스트한다.
1. 주요 대상
하나의 데이터베이스에 많은 양의 데이터를 한 번에 입력/수정하거나, 여러 개의 데이터베이스에 다양한
데이터를 한 번에 입력/수정하는 프로그램에 대해 테스트를 수행함
사용빈도가 높은 화면을 대상으로 테스트를 수행함
2.
수행절차
테스트에 필요한 데이터베이스를 준비함
프로그램이 처리 할 데이터를 준비함
다수의 사용자가 동시에
데이터를 처리하는 경우 해당 테스트 환경을 준비함
보안 테스트
불법적인 소프트웨어 사용을 방지하는 테스트로서 자체의 보안체계가 완벽한 지를 테스트하는 것이다. 또한 적합한 권한을 가지지 않은 사람에게
자료나 정보가 제공되지 않는 것을 보장하기 위한 테스트이다.
1. 주요 대상
전체 시스템에 대한 접근시 보안 상태와 개별적으로 보안이 정의된 프로그램에 대하여 테스트를
수행함
2. 수행절차
보안이 정의된 프로그램을 파악함
해당 프로그램을 다양한 방법(임의 패스워드
등)으로 테스트를 수행함
“죄 없는 자가 있다면 돌을
던져라”
국내 OO은행은 전사 DW(DataWarehouse)를 구축하기 위해 RFP(Request for Proposal)를 공지해 발주를 냈고
대형 SI와 글로벌 솔루션 업체들의 합종연횡을 통해 S사, 국내 H 솔루션사 컨소시엄과 EDW 구축 계약을 했다. 기간은 7개월, 은행 기간계의
여신, 수신, 외환, 공제, 증권 등 은행 내 모든 데이터를 추출, 정제, 로딩을 거쳐 DW를 구축하고 이의 활용을 위한 신 정보계 시스템을
구축하는 것이다.
박 대리는 여신파트 정보계 시스템 구축을 위한 웹 프로그램 담당자이다. 개발자로서 은행 여신업무에 대한 이해를 위해 현업 담당자(이하
현업)와 수차례에 걸쳐 인터뷰를 하고, 데이터 모델에 대한 분석과 설계, 애플리케이션 아키텍처에 대한 스터디와 연습을 통해 개발을 위한 준비
작업을 완료했다. 본격적인 코딩의 시간이 되었다. 2개월의 짧은 기간 동안 200여 개의 조회 화면을 개발해야 한다. 그리고 1개월의 통합
테스트를 거쳐 그랜드 오픈을 한다. 그러기 위해 PL(Project Leader)의 관리 하에 개발을 진행하는 동안에도 현업의 단위 테스트를
거쳐야 한다. 단위 테스트는 개발자의 몫이자 현업 고객이 해야 할 1차 기능 테스트이다.
하루에 화면 5개씩 SQL 쿼리를 짜고 웹 화면에 적용한다. 화면이 복잡하면 할수록 화면 변수에 맵핑해야 할 Input 변수가 많아진다.
개발된 화면에 대한 단위 테스트를 위해 박 대리는 기본적인 자가 기능 테스트를 거쳐 현업에게 단위 테스트를 의뢰한다. 정해진 테스트 프로세스에
의해 하루에 5개씩 개발이 완료된 화면을 현업에게 제공하고 현업은 테스트 후 테스트 결과를 피드백해야 한다.
그런데 고객인 이 차장은 테스트 프로세스를 무시하고 우선 자신이 요구사항에 적은 대로 개발해 놓으라고 한다. 그러면 시간을 갖고 천천히
테스트를 하겠노라고…. 고객의 요청사항인 만큼 맘 놓고 정해진 요구사항대로 휴일도 없이 열심히 개발하고 자가 단위 테스트를 했다. 드디어
2개월이 지나 화면 200여 개발을 다 완료했다. 박 대리는 뿌듯해했다. 이제 남은 건 통합 테스트다. 그리고 통합 테스트는 내일부터 시작이다.
그런데 이 차장이 박 대리가 개발한 화면을 놓고 볼멘소리를 하기 시작한다. 화면 한 개를 테스트했는데 OO은행의 자산이 10조밖에 안 되는데 박
대리가 만든 화면은 100조가 나왔다는 것이다. 박 대리는 이 차장에게 “차장님께서 말씀하신 요구사항대로 개발했다”고 말했다. 이 차장은
개발자인 박 대리의 능력을 믿었고 대충 이야기해도 제대로 알아듣고 개발한다고 생각했다고 한다.
그리고 박 대리는 PL로부터 “내일부터 통합 테스트인데 박 대리가 맡은 부분에 대한 단위 테스트를 진행해 주세요”라고 들었다. 눈앞이
캄캄했다. 남들보다 열심히 고군분투하며 앞서서 개발을 했고, 고객이 원하는 대로 진행했으며, PL에게 진행 상황에 대한 보고까지 하면서 열심히
개발에 매진했지만 박 대리는 통합 테스트에도 미치지 못하는 단위 테스트 불량 개발자였다. 박 대리는 눈물을 머금고 이 차장과 함께 단위 테스트를
다시 진행했다. 200여 화면에 대해 하나씩 기능에 대한 검증과 조건에 대한 검증 그리고 데이터에 대한 검증을 진행해 나갔다. 1개월이 흘러
다른 부분은 통합 테스트를 완료한 상태에서 오픈을 했고 박 대리가 맡은 부분은 오픈이 연기가 되어 통합 테스트를 보름간 더 진행했다. 프로젝트
팀원이 모두 철수한 후까지 박 대리는 미진한 통합 테스트를 진행했고, 결국 프로젝트 전체 납기에 영향을 줘 고객과의 약속도 지키지 못했다.
개발자인 박 대리는 과연 무엇을 잘못한 것일까? 고객의 요청사항을 무조건 들어준 것이 잘못인가? PL에게 보고도 했는데 왜 비난은 박 대리가
들어야 할까? 참으로 난감하다. 테스트는 과연 누구의 책임일까? 개발자인 박 대리는 열심히 개발한 죄밖에 없었을 텐데 말이다.
문제 예방을 위한 최선은 무엇인가
김 과장은 머리가 터질 지경이다. 이제 곧 일주일간의 통합 테스트를 시작해야 하는 데 아직 환경이 구축되질 않았다. 분명 2주일 전에
계획을 세우고 R&R(Role & Responsibility)을 정하고 체크리스트(Checklist)를 만들어 점검까지 했는데도
말이다.
현업에게 뭐라고 이야기해야 할까? 통합 테스트 환경을 구축하기로 한 담당자는 개발자들이 개발 소스에 대해 제대로 단위 테스트를 하지 않아
에러가 발생한다고 한다. 개발자들은 현업의 요구사항이 단위 테스트할 때 변경되어 적용하다가 그랬다고 한다. ‘그래, 통합 테스트의 이틀
지연이다’라고 결심한 김 과장은 고객에게 양해를 구하고, 에러가 발생한 단위 테스트를 집중적으로 해서 기능에 대한 보완을 한다.
오늘부터 개발자들에게 밤샘야근을 지시한다. 어쩔 수 없다. 이틀 후에는 통합 테스트를 실시해야 한다. 고객이 최대의 관심사를 갖고 주시하고
있기 때문이다. 통합 테스트를 제대로 이행하지 못하면 오픈 지연으로 납기에 차질이 생긴다. 현업이 담당한 통합 테스트 시나리오를 점검한다.
엉망이다. 개발팀 담당자를 불러 시나리오에 대해 협의를 했느냐고 물어보았다. 현업이 물어보았지만 시나리오는 현업의 책임이라고만 이야기했단다.
현업은 가이드 없이 대충 작성하여 제출한 것이다. 큰일이다. 새로 작성하자니 시간이 없고 이대로 진행하자니 통합 테스트가 엉망일 것 같다.
현업과 사태를 해결하기 위한 회의를 했다. 현업은 자신 있게 말한다. “통합 테스트 시나리오가 없어도 현업들은 각자 생각한 대로 테스트
케이스를 만들어 테스트할 것이다. 굳이 문서로 작성할 필요가 없을 것 같다” 맞는 말이다. 하지만 이렇게 되면 현업이 생각하는 테스트의 범위,
비즈니스 로직, 데이터 등을 컨트롤할 수가 없다. 어떻게 할지 고민이다. PM과 상의를 한다. PM이 적정한 조정안을 제시한다. 그 안은 다음과
같다.
“상세한 통합 테스트 시나리오를 가지고 통합 테스트를 실시하지 않지만 현업이 직접 테스트한 결과에 대한 시나리오 및 테스트 결과는 문서로
작성하여 제출한다. 그리고 에러 발생시 결함 보고서를 제출한다”
현업은 잠깐 고민한 후 즉각 승낙한다. 이틀 후 통합 테스트는 실시되었다. 전쟁이다. 현업 담당자는 테스트를 실시하고 에러 발생한 즉시
개발자는 뛰어다닌다. 단위 테스트 시 해결됐던 에러도 다시 발생한다. 단위 테스트 시 발생하지 않았던 에러도 발생한다. 외부 인터페이스가
성공했다 실패했다 한다.
하루를 마치고 테스트 케이스와 결함보고서를 정리한다. 테스트 범위는 10%인데 결함은 무려 100개를 상회한다. 이제 개발자들과 회의를
진행한다. 우선, 에러를 단순결함과 중결함으로 구분한다. 단순결함에 대해 수정 조치를 먼저 하여 에러의 개수를 줄여나간다. 중결함은 이틀 정도
시간을 두고 개발자에게 해결을 지시한다. 벌써 12시가 넘어가고 있다. 내일 이틀째 통합 테스트가 기다리고 있다. 3일째가 되자 통합 테스트는
속도를 올려 진행된다. 테스트 범위가 벌써 70%를 상회한다. 에러는 점점 줄어든다. 이제 안정을 찾아가는 듯하다. 개발자들에게 에러 수정을
독려한다. 중결함이 아닌 단순결함들은 당일 수정 조치를 원칙으로 하고 개발자들을 독려한다. 현업들이 차츰 안정을 찾아간다. 오픈을 해도 된다는
낙관론이 생기기 시작한다. PM에게 보고한다. 통합 테스트가 오픈 수준에 맞추어 진행되고 있고 현업이 원하는 수준의 품질(quality)을
보장할 수 있을 것 같다. PM은 무뚝뚝하게 경고한다.
“김 과장, 자네 QA 역할이 뭔 줄 아나? QA는 에러가 발생하면 그때그때 신속하게 처리하도록 지시하는 게 아니라 에러의 발생을 애초부터
막는 것일세“
김 과장은 마음이 상했다. 그래도 최선을 다해 에러 발생시 신속하게 수정지시를 해서 고객의 마음을 조금은 돌려놓았는데 말이다. 김 과장은
고민한다. QA의 역할이 에러의 발생 방지라면 어떻게 에러 방지를 할 수 있을까? 그럼 개발 단계부터 QA의 주도가 필요할 것이다. 그리고 통합
테스트 시나리오는 누가 작성하는 게 맞을까? 분명 현업이 하는 것이 맞을 텐데 어떤 고객도 하겠다고 하질 않으니 그것이 문제이다. 어떻게 그들을
설득시켜야 할까? 현실과 이상의 커다란 간극, 이것이 딜레마이다.
등잔 밑이 어둡다, 모든 환경변수에 대해
고민하라
문제는 응답 속도이다. 고객은 응답속도의 기준치를 ‘3초 이내’로 제시했다. 개발해야 하는 모든 화면에 대한 응답속도를 3초 이내로
끌어내려야 한다는 것이다. 아키텍처 프레임워크는 검증된 것을 적용했으니 문제가 없는데 비즈니스 로직이 문제이다. 원하는 기능들이 복잡할수록
네트워크를 타고 전송되는 패킷의 양이 많아져 PC에서의 로딩 시간이 길어지면 3초 이내를 지키기는 거의 불가능에 가깝다. 하지만 어찌하랴 고객이
원하니 어쩔 수가 없다. 홍 과장에게 숙원 과제가 맡겨졌다.
우선, 성능 테스트를 실시해서 현재의 상황에 대한 문제점을 도출해야 한다. 그리고 도출된 문제점을 해결하기 위해 튜닝을 실시해서 고객의
기준치를 맞추어야 한다. 홍 과장은 시스템 엔지니어인 박 책임에게 성능 테스트 환경구성을 의뢰하고, 개발팀에게 만들어진 개발소스에 대한 테스트
빌드를 구성하기 위해 성능 테스트 계획을 세웠다. 성능 테스트 환경은 운영(production) 환경과 유사하게 구성이 되어야 한다. 운영체제와
소프트웨어 버전이 같아야 하고, 하드웨어 용량은 운영환경의 것을 이용하면 최고겠지만 그렇지 못할 경우는 성능 테스트계를 임시로 구성하여 2/3
정도의 크기로 갖추어 놓는 게 좋다.
시스템 엔지니어인 박 책임은 성능 테스트 환경구성에 대해 일정에 맞추어 설치를 완료하겠다고 약속했다. 다음은 성능 테스트 시나리오의
작성이다. 다행스럽게 통합 테스트에서 사용하던 통합 테스트 시나리오가 있어 이를 재활용하기로 한다. 다음은 목표 동시사용자 수의 설정이다. 성능
테스트를 통해 목표 동시사용자 수에 맞게 환경구성과 개발소스에 대한 튜닝이 이루어지면 된다. 구 시스템에 대한 월/주/일/시간대별 사용자 수를
추출하여 최번시(최고 피크시) 동시사용자 수를 설정했다. 다음은 성능 테스트 시나리오에 맞게 툴을 이용하여 스크립트 코딩을 한다.
드디어 1차 성능 테스트의 결과가 나왔다. 암담하다. 목표 동시사용자 수에 훨씬 미치지도 못하는 수치가 나왔고 응답속도는 10초를
상회한다. 하드웨어와 소프트웨어의 환경구성에 대한 파라미터를 재설정하고 개발팀에게는 소스 내 잘못된 SQL과 로직에 대하여 수정을 요청한다.
2차 성능 테스트를 실시한다. 2차에 비해 나아지기는 했지만 여전히 어이없는 수치이다.
개발팀과의 마라톤 회의를 통해 소스 내 모든 코드에 대한 점검을 실시한다. 개발자들은 스타일에 따라 코딩을 했다. 표준화를 강력히
요청했지만 표준화된 팁을 사용하지 않는 개발자가 대다수였다. PM에게 현상에 대한 보고를 하고 개발자들에게 표준화된 형태로 코드를 수정할 것을
지시했다.
3차 성능 테스트를 했다. 고객이 설정하고 요청한 목표 동시사용자 수와 응답속도를 만족하는 수치가 나왔다. 성공이다. 역시 성능에 대한
키는 개발자들이 쥐고 있었다. 기쁜 마음으로 성능 테스트에 대한 결과보고를 하고 오픈을 해도 좋다는 고객의 동의를 얻어냈다. 드디어 오픈하는
날이다. 시스템 가동과 함께 시스템에 대한 사용도가 올라간다. 그런데 이상하게도 응답속도가 제대로 나오지 않았다. 어떤 것은 10초를 넘는 것도
있었다. 큰일이었다. 분명 몇 차례에 걸친 성능 테스트를 통해 코드에 대한 튜닝, 파리미터에 대한 튜닝을 했고 고객의 목표치를 만족했는데
말이다.
본격적인 조사에 착수했다. 네트워크 환경과 PC의 성능차이가 원인인 듯 했다. 고객은 현장 응답속도 기준으로 3초를 요청했단다. 막막했다.
현장의 인프라를 고려하지 않고 성능 테스트를 한 것이다. 현재의 인프라를 마음대로 업그레이드할 수 없지만 환경변수에 대한 고려가 포함된 성능
테스트를 실시했어야 한다는 것이다. 사용자의 불만은 날마다 수십 개씩 접수되었다. 도저히 쓸 환경이 되지 않으니 이전 시스템을 사용하게 해달라는
요청도 있었다. 밤을 세워가며 고객과 현재의 문제점에 대한 대안을 논의했다.
사용자에게 PC의 업그레이드를 요청하고 네트워크 인프라 또한 네트워크 파트의 도움으로 취약 지역에 대한 증설을 하기로 했다. 홍 과장은
노력한 만큼 결과를 얻지 못했다고 풀이 죽어 있었다. PM은 그런 변수도 고려하지 않고 실험 환경 데이터에 대한 분석결과에 만족해 했다고
질책했다. 고객은 시스템 사용자를 기준으로 목표를 제시한다. 사용자에 대한 분석 없이 성능 테스트 시나리오를 작성하고 환경변수에 대한 고려 없이
성능 테스트를 실시했다고 불만을 토로했다. 성능 테스트는 왜 이리 복잡하고 어려운 것일까? 환경변수에 대한 고려와 함께 성능 테스트를 하는 것이
가능한가? 그런 것은 툴이 지원해 줄 수 있을까?
테스트의 미덕, 중용
그랜드 오픈이 한 달 앞으로 다가왔다. 이제 한 달만 지나면 프로젝트 팀원 50명이 7개월간 고생한 결과에 대해 평가를 받게 된다. 결코
팀원들의 노력이 헛되지 않도록 철저하게 오픈을 준비할 것이다. 지난 6개월 동안 시스템 구축을 위해 요구사항을 분석하고 컴포넌트를 추출, 설계를
하고 코딩을 해왔다. 그리고 500여 화면에 대한 단위기능의 개발과 병행하여 화면 중심의 단위 테스트와 모듈 중심의 단위 테스트를 실행해 왔다.
단위 테스트를 담당한 PL들이 테스트 프로세스를 잘 준수해줬고 현재, 통합 테스트와 함께 성능 테스트를 진행하고 있다. 통합 테스트와 성능
테스트를 마치면 대망의 오픈을 할 예정이다. 그런데 과연 통합 테스트와 성능 테스트만 잘 마치면 성공적인 오픈을 할 수 있는 것일까? 사용자에게
편리하게 화면 설계가 되었고, 응답속도도 3초 이내로 사용자 기대수준을 만족하고, 시스템 사용상의 불안정성도 제거한, 사용자가 만족하는,
성공적인 시스템을 오픈할 수 있는 것일까? PM으로써 리스크를 최소화하고 성공에 대한 확신을 줄 수 있는 테스트 결과에 대한 근거를 기반으로
고객이 인정하고, 우리 스스로가 인정할 수 있는 시스템을 제공해야 한다.
강 PM은 실로 오래간만에 소프트웨어 공학론을 펼쳤다. 테스트에 대한 부분을 세밀히 훑어봤지만 강 PM이 지금 필요로 하는 테스트와
검증방법은 찾아볼 수 없었다. 그저 통합 테스트와 성능 테스트를 열심히 하면 된다는 그런 내용들이었다. PL 회의를 소집했다. 현재 진행하고
있는 통합 테스트와 성능 테스트를 체계적이고 상세하게 진행하되 그 외 다른 테스트 방법론의 존재유무를 논의했다. 테스트 전문가인 박 대리가 부정
테스트와 회귀 테스트 그리고 현장 테스트에 대한 제안을 했다.
강 PM은 그 테스트들의 정의와 진행방법 그리고 효과에 대한 진지한 고민을 했고, 박 대리의 제안을 받아들이기로 결정했다. 더불어
고객들에게 다양한 테스트들을 실행함으로 얻을 수 있는 효과에 대해 자랑스럽게 이야기했다. ‘리스트 제거’, 다양한 테스트를 진행하는 궁극적인
목표인 것이다. 강 PM은 외부 테스트 요원들을 모집하고 그들에게 현재 진행하고 있는 테스트 시스템에 대해 테스트 시나리오를 무시한, 기발하고
스토리가 없는, 사용자 입장에서 할 수 있는 가능한 모든 부정적인 테스트를 요구했다.
어떤 이는 조회 화면을 수십 번 연속해서 눌렀고, 어떤 이는 조회 중간에 3초를 기다리지 않고 화면을 닫아 버리고, 어떤 이는 숫자를
넣어야 할 곳에 문자를 넣어 조회하고, 또는 날짜 조건 입력 시 백년의 기간을 조회해 보기도 하는 등 다양한 부정 시나리오가 쏟아져 나왔다.
조회화면을 동일한 조건에서 수십 번 연속해서 누르자 동일한 데이터가 아닌, 새로운 데이터가 계속 조회되었다. 조회조건은 동일한 데 수십 번
연속해서 누른다고 조회내용이 다르게 나오는 것이었다. 해당 개발자는 황당해 했다. 그렇게 사용하는 사용자는 없다는 것이다. 그래도 이런 결과가
나온 것은 코드상 로직의 문제가 있음을 제기했고 개발자도 검토를 해본 결과 자신이 그런 코딩을 했다는 것을 믿지 않는 눈치였다. 이런 부정
테스트에 대한 결과를 고객에게 설명하자 고객은 희색이 만연하여 시스템 품질에 대한 확신을 가지는 눈치였다.
다음 회귀 테스트는 단위 테스트에서 나온 결함을 기본 베이스라인(baseline)으로 설정하고, 통합 테스트, 성능 테스트까지 지속적으로
해당 결함에 대한 회귀 테스트를 실행하여 최종 테스트에 통과가 될 때까지 실행하도록 PL들에게 지시했고, PL들 또한 결함 발생에 대한
추적관리를 통해 ‘한 번 발생한 결함은 두 번 다시 발생하지 않는다’는 원칙을 고수하게 되었다.
마지막으로 현장 테스트를 위해 고객의 적극적인 협조로 업무별 종류, PC 사양의 종류, 네트워크 용량의 종류 등 다양한 케이스의 현장을
선정하고 동일한 시나리오를 통해 기능의 완전성과 응답속도의 차이를 측정하고 기준을 설정하여 해당 시스템에 대한 현장 사용자의 만족도를 예측할 수
있었다. 정말로 다양한 케이스에 따라 기능의 완전성에도 차이가 있었고, 응답속도의 차이 또한 천차만별이었다. 고객이 제시하는 ‘3초 이내’는
어떤 기준인지 고객의 기준을 명확히 하는 근거가 될 수 있었다.
이런 추가적인 비정형적인 테스트를 통해 고객은 시스템에 대한 신뢰를 가질 수 있었고, 프로젝트팀은 7개월의 고생이 헛되지 않는 성공적인
오픈을 할 수 있었다. 테스트 종류 몇 가지를 실행한 것뿐인데 고객은 결과에 대해 대만족스러워했고 시스템은 안정적인 운행을 하게 되었다. 그저
단위 테스트, 통합 테스트, 성능 테스트 등 정형적인 테스트만 수행했을 경우는 어떠했을까? 물론, 테스트의 종류가 많다고 고객이 신뢰를 하는
것은 아니다. 단지, 현재 진행하고 있는 방법론상의 테스트와 이를 보완할 수 있는 다양한 테스트를 함께 수행함으로써 완벽성을 기할 수 있는
크로스 체크 결과가 된 건 아닐까? 결함이 나오는 테스트가 올바른 테스트일까? 아니면 결함이 하나도 없는 테스트가 올바른 테스트일까? 테스트는
그 역할로 인해 항상 중용의 길을 걸어야 할 존재인 것이다.
모든 해답은 프로젝트 현장에 있다
테스트는 아무리 강조해도 지나치지 않는 활동이라고 했다. 대부분 프로젝트들은 필수적인 테스트(단위, 통합, 성능)만 선정하고 준비하고
실행하여 이를 통해 나온 결과만을 가지고 의사결정을 한다. 그리고 오픈 후 많은 문제에 직면하게 된다.
기능의 오류, 시스템의 불안정, 요구사항의 미반영, 사용자의 미숙 등 프로젝트 막바지에 테스트에 모든 인력과 정열을 집중했음에도 불구하고
예측하지 못한 결함들이 쏟아져 나온다. 이를 어떻게 해야 하는가? 어쩔 수 없는 것일까? 테스트에 아무리 집중해도 품질목표를 달성하는 것은
프로젝트에서는 불가능한 목표일까?
문제는 바로 프로젝트 현장에 있다. 필수적인 테스트들을 선택하고 집중하여 실행했지만 여기에는 많은 헛점이 있다는 것이다. 또한 좀 더
완벽한 품질을 달성하고자 한다면 시스템 특성에 맞는 테스트를 전략적으로 적용해야 하는 것이다. 다음은 테스트 종류별 잘못된 실행사례이다.
첫째, 단위 테스트를 개발자에게만 맡겨두고 그 결과를 인정하는 경우이다. 개발자는 본인이 코딩한 프로그램에 대해 해당 기능에 대한 소극적인
테스트에 임한다. 데이터는 알고 있는 데이터 1~2개 정도이고 다양한 조건에 대한 테스트는 개발자에게 기대하기 힘들다. 왜냐하면 그들은 방대한
개발물량이 있기 때문에 진척율에 쫓긴다. 이를 예방하기 위해 반드시 해당업무 PL이 개발자들이 실행한 단위테스트에 대한 확인테스트를 실행한 후
진척율에 반영하는 것이다.
둘째, 통합 테스트 수행 시 통합 테스트 시나리오를 고객이 미리 작성하지 않고 개발팀에서 형식적으로 간략하게 작성하는 경우이다. 이런 경우
고객은 자신의 머릿속 시나리오대로 테스트를 진행하고, 개발팀은 테스트 케이스에 대한 전체범위를 모르는 상태에서 테스트를 실행하는 고객의 수준과
태도에 따라 시스템 내 품질은 업무범위에 따라 고르지 못한 상태가 된다. 이런 경우, 프로젝트팀은 품질 목표를 달성할 수 없게 되고 고객에게
맡겨진 품질은 미궁 속으로 빠져들게 된다. 이를 예방하기 위하여 고객들에게 통합테스트가 시작되기 한 달 전에는 교육을 통해 통합 테스트 시나리오
작성의 당위성, 필요성에 대해 설득하고 합의를 이끌어 내어 반드시 통합 테스트 시나리오를 작성한 후 통합 테스트를 실행하는 것이다. 통합 테스트
시나리오는 초기 고객의 요구사항 정의서와 함께 고객의 요구사항이 반영된 최종 품질기대 문서이다. 셋째, 성능 테스트 수행 시 사용자 환경(PC,
네트워크 등)에 대한 고려 없이 성능 테스트 툴을 통해 나온 응답속도와 동시사용자 수에 대한 무비판적인 수용이다. 이런 경우 오픈 후 반드시
성능, 특히 응답속도에 대한 불편신고를 가장 많이 받는다. 성능 테스트는 시스템의 성능, 동시사용자 수 그리고 화면별 응답속도에 대한 객관적인
수치를 얻고자 한다.
이를 위해 TA(Technical Architect)는 운영환경과 유사하게 성능 테스트 환경을 구성하고 해당 프로그램들을 선정, 비율을
조정하여 테스트를 실행한다. 그리고 최번시 수용 가능한 동시사용자 수와 시스템 사용현황 그리고 응답속도를 데이터로 제시한다. 그리고 성능
테스트는 끝이다. 하지만 현장사용자의 IT 인프라 환경을 고려하지 않은 상태에서 제시한 데이터는 실험실 내에서의 테스트일 뿐이다. 그래서 반드시
현장 사용자의 IT 인프라 현황을 파악, 분석하여 다양한 조건의 테스트베드를 만들고 반드시 현장의 응답 속도를 측정한 후 튜닝을 실행하여 IT
인프라와 응답속도간 상관관계를 파악하여 오픈 후 응답속도에 대한 불편을 제거해야 한다.
넷째, 인터넷 시스템을 오픈하면서 현장 테스트를 실시하지 않는 경우이다. 물론 현장 테스트를 회사 내에서 실행하는 경우도 있지만 이는
요식행위이며 해당 인터넷 시스템을 사용하는 모든 고객의 장소를 분석하여 기능의 완전성, 응답속도의 적절성 등을 테스트해야 한다. 고객의 장소는
PC방, 고객의 집 PC 등이 있고 이 또한 오래된 PC방, 신장개업 PC방 그리고 여전히 윈도우 95/98 같은 운영체제를 사용하는 고객의 집
PC 등으로 세분화할 수 있다. 고객의 IT 인프라는 사용자의 특성에 따라 동일한 환경이 거의 없다. 그리고 인터넷에는 수많은 프로그램들이
쏟아져 나와 있어 해당 인터넷 시스템과 충돌이 나는 경우도 종종 발생한다.
이상과 같이 테스트는 그 종류가 많은 만큼 실행상의 허점이 곳곳에 널려 있다. 테스트 관리자는 전략 수립과 함께 실행계획 수립 시
예외조건을 빠트리지 않도록 주의를 기울이고 테스트는 결국 개발된 프로그램 전체를 대상으로 하기 때문에 테스트 범위는 이 시스템을 사용하는 모든
고객을 대상으로 한다고 생각하고 테스트 관리자는 예외가 없는 전수 테스트에 임해야 할 것이다.
개발 중심에서 테스트 중심으로
테스트가 시대를 만났다. 천대받던 시절을 이겨내고 테스트는 품질을 확인하고 검증하고 보증하는 중추적인 역할을 맡게 되었다. 이에 따라 많은
테스트 관련 툴들도 우후죽순처럼 시장에 쏟아져 나왔다. 이제 테스트는 프로젝트 라이프 사이클(PLC) 전 기간에 걸쳐 그 역할을 확대하고 있다.
테스트의 미래는 어떻게 될까? 가까운 미래를 예측해본다.
서기 2010년 7월, K은행 기간계 구축 프로젝트. 이 부장은 고객과의 요구사항 확정에 대한 협의가 끝나자 PL들에게 통합 프로젝트 관리
툴(이하 통관툴)에 요구사항을 직접 입력하도록 지시했다. 요구사항들은 연속적으로 번호가 붙여지며 관리를 위한 베이스라인으로 확정되었다.
분석/설계자 최 과장은 이에 대한 세부 협의를 통해 설계 스펙을 통관툴에서 확정한다. 그와 동시에 개발자가 지정되었다. 개발자인 김 대리는
통보된 스펙 대로 프로그램을 코딩하고 기능 테스트 시작 버튼을 누른다. 조회조건 입력을 요청한다. 테스트 데이터를 랜덤하게 선택하여 100개를
자동 입력한다.
통관툴은 만들어진 프로그램을 하나씩 하나씩 코드 레벨로 실행하며 에러와 권고 리포트를 생성한다. 코드에 대한 100% 커버리지로 테스트를
종료한다. 에러와 권고 리포트를 읽어보며 요청한 대로 코드를 수정한다. 재 테스트를 실시한다. 이젠 100% OK가 나왔다. 김 대리는 해당
프로그램을 통합 테스트로 이동하도록 선택한다. 통합 테스트 저장소(repository)는 테스트 관리자인 박 과장 관리 하에 통합 테스트가
가능한 시점을 알려준다. 박 과장은 1주일 전 통합 테스트 시나리오에 대한 고객과의 협의를 통해 미리 시나리오를 입력해 두었다. 박 과장은 통합
테스트 시작버튼을 누른다. 우선, 단일 기능은 완벽했다. 그리고 외부 인터페이스와의 테스트도 원활했다. 통합 테스트는 입력된 테스트 케이스 대로
자동으로 수행된다. 이에 따라 에러가 발생한 경우 에러 리포트와 해결방안이 자동으로 표시된다.
통합 테스트가 완료된 프로그램은 부정 테스트와 회귀 테스트하도록 선택한다. 통관툴은 정해진 방식대로 부정테스트를 실행하고 단위 테스트에서
발생했던 에러를 기준으로 회귀 테스트를 실행한다. 완벽하다. 이제 남은 건 성능 테스트이다. 해당 소스를 빌드하여 성능 테스트계에 이관하고 성능
테스트 버튼을 누른다. 10 유저, 100 유저 계속 유저수가 올라가며 성능 테스트가 실행된다. 150 유저가 되었을 때 응답속도가 2초가
되었다. 초기 세워둔 기준대로 성능 테스트는 대만족이다.
다음 현장 테스트 버튼을 누른다. 소스가 현장 테스트베드 시스템으로 이관된다. 조건이 다양하다. PC방, 고객집, 지방 격오지까지 선택이
가능하다. 필요한 조건을 선택하고 현장 테스트 버튼을 누른다. 시스템은 테스트가 실행되면서 다양한 결과를 보여준다. 결과를 분석하고 PC방에서의
응답속도가 저조함을 선택하고 충돌이 발생하는 프로그램을 찾아본다. 특정 회사의 메신저가 해당 시스템과 충돌이 나서 응답속도가 저조해졌다는
결과이다. 개발자인 김 대리에게 충돌이 나는 부분에 대해 수정을 요청한다. 김 대리는 소스분석을 통해 충돌지점에 대한 로직을 수정하고 다시 현장
테스트를 요청한다. 재 테스트를 실시한다. 이번엔 OK이다.
정해진 오픈은 앞으로도 한 달이 남았다. 만일에 발생할 수 있는 오류를 찾기 위해 박 과장은 퇴근하면서 통합 테스트, 부정 테스트, 회귀
테스트, 성능 테스트, 현장 테스트 등 모든 테스트에 대한 버튼을 실행한다. 통관툴은 해당 명령에 대해 수준을 올려가며 테스트를 진행한다.
앞으로 남은 한 달 동안 통관툴을 통한 테스트는 계속될 것이다.
미래의 테스트는 프로젝트 시작과 함께 시작될 것이다. 요구사항에 대한 정의가 설계에 반영되어 코딩이 되면 이에 대한 다양한 테스트가
자동으로 실행되어 에러 리포트를 쏟아 낼 것이다. 물론 요구사항을 입력하고 시나리오를 입력하는 수기의 과정은 필요할 것이다. 이에 대한 자동화는
가까운 미래가 아닌, 조금 먼 미래쯤이면 가능할 지 모르겠다. 테스트의 중요성은 이처럼 나날이 증가하고 있다. 프로젝트 초기단계부터 테스트를
위한 준비를 하는 것이다. 다시 말해 개발 중심의 방법론이 아닌, 테스트 중심의 방법론으로 대체가 될 것이다. 많은 솔루션 업체와 SI 업체를
중심으로 테스트를 통한 품질확보를 위한 최적의 프로젝트 방법론과 도구들을 쏟아낼 것이라고 기대해본다