이번 포스트에서는 저번 포스트에 이어서 탐색적테스팅을 하면서 버그를 찾아내기 위해 어떤 점들에서 신경을 써야할지 기재합니다.
아래 포스트들에서 이어집니다.
주어진 요구사항에 따라 기대되는 겨로가가 명확한 경우도 있습니다. 그러나 눈앞에 보이는 결과가 정확한지 판단하기 위해, 개인의 주관적인 견해나 특별한 전문 지식을 필요로하는 경우가 더 많습니다.
사실 이런 경우가 탐색적 테스팅을 할 떄 가장 큰 도전이기도 합니다. 탐색적 테스팅은 소프트웨어와 관련해서 이전에는 그 누구도 생각하지 않았던 질문들을 던지는 것을 포함합니다. 그러나 질문을 던지는 것에서 끝나는 것이 아니라 어떻게 탐험을 계속 진행하는 것이 좋을지, 또는 적어도 찾아낸 수많은 정보 중에서 추가로 조사가 더 필요한 중요한 정보를 어떻게 걸러낼지 하는 것만이라도 생각해보는 것도 필요합니다.
시스템은 나름 어떠한 규칙을 가지고 있습니다. 탐색적 테스팅을 수행할 때 우리가 해야할 일 중 하나는, 결코 일어나지 않거나, 항상 일어나야하는 소프트웨어 규칙을 찾아내는 것 입니다.
어떠한 경우라도 테스팅중에 결코 일어나지 않아야 하는 일이 일어나거나, 항상 일어나야 하는 일이 일어나지 않는다면, 그것은 아주 심각한 문제입니다. 그래서 탐색적 테스팅 중에 어떤 결과들이 나와야 하는지 아주 자세하고 확실하게 알지는 못하더라도, 적어도 기대했던 결과들이 아닌 경우에는 절대 그냥 넘어가서는 안 됩니다. 사실 꼭 지켜져야 하는 규칙들이 지켜지지 않는 경우를 찾아낼 수 있다면 좋겠지만, 어떤 데이터나 설정이나 일련의 동작들을 조합해서 이런 경우를 찾아내는 것은 불가능에 가깝습니다.
그렇다면 테스팅 중인 시스템에서 꼭 지켜야하는 규칙들이 무엇인지 어떻게 알 수 있을까요? 시스템이 절대 하면 안되는 것들 또는 꼭 해야만 하는 것들에 대한 힌트를 얻을 수 있는 가장 좋은 시간은 요구사항에 대해 이야기를 나눌 때 입니다.
시스템은 꼭 수행해야하는 핵심 기능이 있습니다. 소프트웨어는 반드시 필요한 것이 아니라, 가지고 있으면 좋아보이는 부가적인 기능들 또한 가지고 있습니다. 그러나 모든 시스템에는 다른 모든 기능이 실패할지라도 꼭 수행해야하는 핵심 기능들이 있고, 이 핵심 기능들이 시스템의 특별한 고유 기능이 됩니다.
사실 프로젝트의 이해관계자들이 시스템의 핵심 기능이 무엇인지에 대해 서로 다르게 생각하고 있다는 사실을 깨닫기까지는 그리 오래걸리지 않습니다. 시스템이 어떤 기능을 수행해야 하는지를 구체화하는 프로젝트 관리자나 비즈니스 분석가들은 다르게 생각하고 있을 수 있습니다. 프로젝트 이해관계자들이 생각하고 있는 소프트웨어의 핵심 기능들에 대해 공감대를 형상하기 위해서는 다음과 같은 질문들을 서로 해볼 수 있습니다.
때로는 ~성
이나 비기능 요구사항
이라고 부르는 소프트웨어의 품질 요소는 결코 해서는 안되는 것들과 항상 해야만 하는 것들을 또 다른 관점에서 볼 수 있도록 도와줍니다.
위에서 소개한 것은 하나의 예시일 뿐입니다.
이해관계자들이 가장 우려하는 위험 요소는 숨겨져 있어서 보이지 않는, 결코 해서는 안되는 것들과 항상 해야만 하는 것들이다. 의료 기기같이 안전이 필수인 시스템에서는 환자에게 해를 끼치는 모든 것이 놓쳐서는 안되는 위험요소입니다. 금융 관리 시스템에서는 돈이 없어지는 것이 위험 요소입니다. 결제 시스템에서는 고객의 결제 금액이 청구되지 않거나 과잉 청구되는 것이 위험 요소입니다.
테스트를 해야하는 시스템이 있는데, 이 시스템에 대한 자세한 요구 사항 정의서나 설계 문서가 없는 상황이라면, 시스템이 어떻게 동작해야 하는지 예상하는 것이 불가능해 보일지도 모릅니다. 하지만 시스템의 동작을 예상하는 데 필요한 가장 훌륭한 자원을 이미 가지고 있다고 할 수 있는데, 그것은 바로 테스트 가능한 소프트웨어 그 자체 입니다. 또한 필요한 다른 자원들을 얻을 수 있는 기회가 있는 경우도 있습니다. 상황에 따라 다르겠지만, 비슷한 일을 하는 다른 소프트웨어 패키지에 대한 정보를 얻을 수 있는 기회도 있습니다. 또는 소프트웨어가 공개된 표준에 따라 개발되고 관리되는 경우도 있습니다.
소프트웨어 사용자들은 자신이 사용하는 소프트웨어가 당연히 모순이 없는 일관성을 가지고 동작할 것이라고 믿습니다. 그래서 소프트웨어가 정확하게 동작하고 있는지 평가하는데 있어 소프트웨어 그 자체가 큰 도움이 될 수 있습니다.
의료 업계, 금융 서비스, 방위 산업 같이 규제가 엄격한 분야에서 소프트웨러를 개발한 경험이 있다면, 소프트웨어가 꼭 지켜야 하는 표준에 이미 익숙할 것이고, 심한 경우에는 표준때문에 아주 고생했던 기억이 있을 수 있습니다.
규제가 심한 분야가 아니라 할지라도, 테스트하는데 놓치지 말아야하는 것들의 목록을 만드는데 도움이 되는 표준들을 찾을 수 있습니다.
물론 소프트웨어가 관련 표준들을 따를 것인지 아닌지 결정하는 것은 소프트웨어의 요구사항을 정의할 때 놓치지 말고 챙겨야 할 중요한 결정 사항 중 하나입니다. 소프트웨어가 표준들을 지키는지, 지키지 않는지 확인하는 데 시간과 노력을 허비할 필요는 없습니다. 그러므로 소프트웨어가 어떻게 동작할 지 예측하려고 표준 문서를 참고하기 전에, 소프트웨어가 이 표준을 따르기로 했는지, 모든 이해관계자가 이미 동의했는지 확인 해보는 것 이 중요하겠습니다.
회사에서 하나가 아닌 여러 소프트웨어 패키지를 만드는 경우라면, 여러 다른 상황에서 소프트웨어가 어떻게 동작해야하는지 확인이 필요할 때 다른 패키지들을 참고 할 수 있습니다. 인증되지 않은 사용자가 인증이 꼭 필요한 정보를 요청할 때 시스템은 어떻게 응답해야할까요? 파일 내용을 기반으로 일괄 처리를 하는 시스템이 있는데, 받은 파일이 아무 내용도 없는 빈 파일이라면 어떻게 해야할까요? 등등.. 회사의 다른 소프트웨어들이 이러한 질문들에 대한 답을 이미 가지고 있을 수 있습니다.
고객이 직접 사용하는 소프트웨어를 테스팅하고 있다면, 이 소프트웨어의 참조 모델이 될 수 있는 비슷하거나 연관된 소프트웨어를 찾을 수 있을 것입니다. 특별하게 정의된 표준이 없는 경우라 할지라도, 애플리케이션들이 대부분 공통으로 사용하는 접근 방법이 있는 경우가 많습니다. 비슷하거나 연관 있는 부분이 많아서 비교가 가능한 시스템들을 이미 사용해본 경험이 있는 경우라면 비교가 가능한 시스템들이 특별히 더 큰 도움이 됩니다.
그러므로 테스팅을 시작할 때, 내가 지금 테스팅하려는 소프트웨어와 비교가 가능한 다른 소프트웨어들을 찾아내서 참고하면 훌륭한 가이드 역할을 해줄 것입니다.
몇몇 소프트웨어는 소프트웨어가 어떻게 동작할지 예측하려고 여러 방향으로 시도해보아도, 그 어떤 예측도 허용하지 않는 경우가 있습니다.. 과학이나 금융과 관련된 소프트웨어들은 보통 다양하고 수많은 입력값들을 가지고 굉장히 복잡한 계산을 수행하는데, 이 분야가 너무 복잡하기 떄문에 결괏값을 예상하는 것이 거의 불가능하다고 볼 수 있습니다. 심지어는 그 분야 전문가라 할지라도 계산된 결괏값이 맞는지 아닌지 확인하는 것은 아주 고된일이 되기도 한다.
심지어 시뮬레이션이나 모델링 소프트웨어는 예측하기가 훨씬 더 어렵습니다. 이런 소프트웨어들은 확률에 따라 결괏값을 계산하기 위해 비결정적 알고리즘을 사용하기 때문에, 의도적으로 예측하기 어렵게 만들어졌다고 볼 수 있습니다.
그러나 아래와 같은 방법들을 사용하면 아주 정확한 값보다는 결과의 특징들을 잡아낼 수 있습니다.
실제 사용자들은 대부분 소프트웨어 애플리케이션을 ㅈ어해진 규칙에 따라 사용하지 않습니다. 소프트웨어 어플리케이션을 만들 때 의도한 사용 순서를 따르지 않고 닥치는 대로 사용하는 경우가 매우 많습니다.
웹 앱이 브라우저의 히스토리 탐색을 지원하는지 안하는지는 상관없이 브라우저의 뒤로가기와 앞으로가기를 무한정으로 반복하는 사용자가 있기도합니다. 메뉴에 실행취소와 재실행이 있으면 최대한 몇 번까지 사용가능한지를 확인하지않고 끊임없이 사용하는 유저도 있습니다. 복사와 붙여넣기를 할 때 프로그램끼리 호환되는지를 확인하지도 않는다.
또한 사용자들은 주어진 제약 사항을 회피하려고 다른 여러 방법들을 사용해보기도 합니다. 때떄로 이용자의 아이들이나 애완동물들도 컴퓨터에 접근할 수 있다. 결과적으로 키를 막 누르거나 순서 없이 무작위로 데이터나 프로그램을 삭제하거나 무엇인가를 설치, 삭제하는 도중에 컴퓨터 전원을 끄는 것과 같이 논리적인 사고를 지닌 사용자에게 서는 절대 이렁나지 않을 것 같은 일들이 일어나기도 합니다.
소프트웨어를 매뉴얼에 따라 사용하든지 아니면 의도하지 않은 방법으로 사용하든지 상관없이 잠재되어있는 심각한 문제를 찾아내려면, 소프트웨어와 상호 작용하는 방법을 바꿔볼 필요가 있습니다.
테스트를 진행중인 소프트웨어에 점점 더 익숙해지면, 소프트웨어와 상호 작용하는 방법에 있어 특정 습관에 빠질 가능성이 높습니다. 이 습관을 고치기 어려운 두 가지 이유가 있습니다.
입니다.
자기 습관을 깨뜨릴 수 있는 한 가지 방법은 어떠한 규칙도 따르지 않고 무작위로 모든일을 진행 해보는 것이다.
이러한 무작위로 만들어진 시나리오를 따라 테스트를 진행할 때, 예상하지 못했던 것들에서 힌트를 얻기 위해 주의깊게 살펴봐야 한다는 것을 꼭 기억합시다. 특히 시스템이 꼭 해야하는 것들과 절대 해서는 안되는 것들을 위반하는 경우는 없는지 신경써야합니다.
GUI가 있는 애플리케이션을 사용하는 방법을 바꿔보는 것은 아주 중요합니다. 마우스를 사용하지 않고 테스트를 진행하면, 화면에 보이는 구성 요소들을 마우스로 클릭했을 때나 마우스 포인터가 올려져 있을 때 잘못 동작한다는 사실을 알아내지 못할 수 있습니다. GUI가 있는 애플리케이션을 테스트할 때 동일한 일을 할 수 있는 여러가지 방법에 주의를 기울어야합니다.. 버튼, 링크, 메뉴, 윈도우 컨트롤과 같이 GUI를 이루는 모든 요소에 주목해야합니다.
테스트를 하면서 한 가지 방법만을 계속 고수하기 보다는, 테스트를 진행하면서 일정 시간이나 장소에 따라 이전과는 다른 방법을 선택해서 사용해보는 것이 큰 도움이 될 것 입니다.
페르소나는 우리가 만든 시스템을 사용하는 사용자 유형을 대표하는 가상의 전형적인 인물을 의미합니다. 페르소나는 시스템을 설계할 때 도움이 되는 것 처럼, 시스템을 탐험할 때도 페르소나가 아주 유용하게 사용될 수 있습니다.
페르소나의 입장이 되어서 생각해봅시다. 소프트웨어를 탐험할 때 페르소나의 개인적인 성격, 의도, 관심사 등을 받아들여야합니다. 내가 만든 페르소나가 선택할 것 같은 것을 똑같이 선택하도록 노력해야한다.
소프트웨어를 탐험할 때 실제 사용자 역할을 대신해주는 전형적인 페르소나를 정의함으로써 서로 다른 사용자들이 소프트웨어를 얼마나 다르게 사용하는지에 따라 달라지는 변화들과 관련된 문제들을 더 잘 찾아낼 수 있습니다.
좀 더 나아가서 기술에 대해 전혀 모르는 페르소나를 상정한다고 가정해봅시다. 그런 사람의 입장이 되어서, 기술적인 지식이 전혀 없는 사람의 역할을 하면서 그 사람이 처한 상황을 재미있게 즐겨봅시다.
3~4개의 포스트에 걸쳐 탐색적 테스팅을 진행해야할 때에 알고 있어야할 것들에 대해 기재해봅니다. 위 내용들은 『탐험적 테스팅 : 배우고 통찰하며 개선하는 소프트웨어 테스트』 의 내용을 요약하면서 동시에 저의 경험들을 같이 기재해본 내용들입니다. 좀 더 자세한 내용에 대해 알고싶으신 분들은 해당 책을 읽어보시길 바랍니다.
끝!
ref