티스토리 뷰

이번호 Testing Experience 의 주제는 모델 기반 테스팅(Model-Based Testing) 이었습니다.

이미 국내에도 다양한 자료들이 소개되어 있고 최근 여러 곳에서 사용하는 기법이라 많은 분들이 관심있게 보셨으리라 생각됩니다.
그 중에서도 Erik van Veenendaal 이 쓴 “Beware!... Model-based Testing”을 번역해 소개합니다.
모델 기반 테스팅의 좋은 점들을 부각시키고 있는 다른 글들과 달리 에릭은 모델 기반 테스팅에 대해 가질 수 있는 환상을 지적하고 유의해야 할 사항들을 다시 한 번 환기하고 있습니다.
MBT
를 사용하고 있거나, 사용하실 의향이 있으신 분들의 일독을 권합니다.

 

번역 및 포스팅에 대해서는 원 저자의 허락을 받았습니다 


환상을 가지지 마라!

지난 20년 동안 소프트웨어 테스팅이라는 일을 하면서 내가 읽고 들었던 모델 기반 테스팅(Model-based testing)에 대한 수많은 이야기들은 한결같이 의심스러운 것 투성이였다. 여러 유명한 잡지와 열정적인 테스트 전문가들이 마치 모델 기반 테스팅이 은총알 이라도 된 것처럼 설명하고는 했다. 그들은 테스트를 설계하고 테스트 케이스를 작성할 때, 그리고 테스트를 자동화할 때 이보다 더 나은 것이 없다고 말해왔다. 나는 그런 말을 들을 때마다 적잖이 실망했다. 그들은 이 기법만 사용하면 엄청나게 자원이 절약되고 수많은 이점을 누릴 수 있으며, 이를 통해 마치 세상이 변하고 그로 인해 전통적인 기법들은 더 이상 존재할 의미조차 없어진다고 말하는 것처럼 보였다. 하지만 현실은 늘 이론과 다르기 마련이다. 나는 실제로 그런 이상적인 기법이 프로젝트에 적용된 것을 거의 보지 못했다. 오랜 동안의 경험을 통해, 나는 사람들이 모델 기반 테스팅이라는 말을 꺼낼 때마다, 곧이 곧대로가 아니라 한 번 더 곱씹으면서 이를 듣게 되었다.

 

일반적으로 모델 기반 테스팅은 다음과 같은 의미로 정의된다.

모델 기반 테스팅(Model-based Testing)은 시스템 요구사항과 동작(behavior)에 대한 모델을 사용해 소프트웨어 테스트 프로시져를 자동화하는 것을 말한다. 각각의 모델을 만들기 위해 많은 사전 작업을 필요로 하지만, 전통적인 소프트웨어 테스팅 방법에 비해 탁월한 효과를 제공한다


이러한 정의에는 다음과 같은 장점을 누릴 수 있다는 의미가 포함되어 있다.

 

n  프로젝트 유지보수를 위한 리소스가 절약된다. 새로운 기능이 추가될 때마다 새로운 테스트를 작성할 필요가 없다. 한 번 모델을 만들어 놓으면 사람이 일일이 새로 테스트 케이스를 작성하는 것보다 쉽게 테스트 케이스를 생성하고 재사용할 수 있다.

n  유연한 설계가 가능하다. 새로운 기능이 추가될 때마다 추가된 새로운 테스트 케이스들이 기존 테스트와 조합되어 수행될 수 있다. 간단한 변경사항들은 기존의 전체 테스트 케이스 스위트와 자동으로 조합되어 반복적인 수행이 가능하다.

n  커버리지 수준이 높다. 단순히 코드 경로(code path)나 의존성(dependency)이 바뀐 것을 검증하기 위한 리그레션 테스트뿐만 아니라, 테스트 범위를 확장해 버그를 발견해 내는 것까지 가능해진다. 

n  모델을 작성하는 것은 테스팅을 구현하거나 실제로 수행하는 것과는 별개의 작업이다. 따라서 이 작업은 팀 내에서 테스트 업무를 맡지 않은 다른 구성원이 수행할 수도 있다.

 

왜 이 모든 혜택을 누릴 수 없는 지 궁금한가? MBT만 적용해 보라! 모든 문제들이 눈 녹듯이 사라질 것이다.     

 

객관적인 사실들

처음부터 너무 많은 테스트 전문가들의 심기를 불편하게 만든 게 아니기를 바란다. 다만 여러분들 대부분에게 경고를 하고 싶었던 것뿐이다. 물론 모델 기반 테스팅은 훌륭한 아이디어이기는 하지만, 앞서 말한 대로 모든 것을 해결할 수 있는 은총알은 아니다. 여러 가지 관점에서 이에 대한 논의가 이루어질 필요가 있어 보인다.

 

위키피디아에서 모델 기반 테스팅에 대한 좀 더 나은 정의를 찾아볼 수 있다.
 

모델 기반 테스팅은 소프트웨어 테스팅을 수행하기 위해 이를 설계하는 과정과 필요한 프로그램을 수행하는 과정에 모델 기반 설계 기법을 적용하는 것을 말한다. 테스트 중인 시스템에서 요구되는 동작(desired behavior)을 표현하기 위해 모델을 사용한다. "

 

모델 기반 테스팅 테스트 자동화

두 번째 정의에 자동화(automation)라는 단어가 등장하지 않는 것에 유의해야 한다. 이 점에 대해 더 고민해 볼 필요가 있다. 모델 기반이라는 것이 의미하는 바는 일반적인 모델을 사용한다는 것이다. 예를 들어, 테스트 케이스를 설계하는 데 있어 UML을 사용하는 것도 모델 기반이라고 볼 수 있다. ‘모델은 테스트가 필요한 시스템을 더 잘 이해하기 위해 사용하는 도구를 말하며, 테스트 케이스를 설계하기 위해 가장 처음부터 사용되는 도구다. 물론 어떤 모델들은 자동으로 테스트 케이스를 생성해 낼 수 있지만 이것이 모델 기반 테스팅의 필수적인 요소는 아니다. 그리고 모두가 잘 알고 있듯이, 자동화는 데모에서 볼 수 있는 것처럼 쉬운 일이 결코 아니다.

 

모든 테스팅은 모델 기반으로 수행된다

한 단계만 뒤로 돌아가 생각해보면, 모든 요구사항은 그것이 정형화된 모델을 사용하든 그렇지 않든 간에, 테스트 대상인 시스템에게 요구되는 동작을 표현하는 모델이라고 볼 수 있지 않은가? 테스트 컨디션을 설정하고 테스트 케이스를 만들기 위해 우리는 항상 요구사항을 사용하고 있는 것이다. 따라서 요구사항에 기반해 수행하는 모든 테스팅(수많은 전통적 테스팅 방법론에서 설명하고 있는)은 곧 모델 기반 테스팅이라고 볼 수 있는 것이다. 이 역시 고민해 볼 필요가 있는 명제다.

 

대규모의 사전 투자

모델 기반 테스팅은 상당한 규모의 사전 작업을 요구한다. 물론 우리는 이러한 사전 작업에 들인 공이 나중에 보상받는다는 사실을 잘 알고 있지만, 관리라는 측면에서는 이렇게 수행하기가 상당히 힘든 것도 사실이다. , 말하기는 쉽지만 실제로 수행하기는 힘들다는 것이다. 이러한 사전 작업은 리뷰와 동시에 진행되어야 한다. 우리는 리뷰에 들인 투자 역시 나중에 그 보상을 얻을 수 있다는 사실을 알고 있지만, 최근에 이루어진 연구에서 우리는 실제로 단지 25%의 조직에서만 전문적인 방법으로 리뷰를 수행하고 있다는 사실을 확인할 수 있었다. 이 점 역시 고려해야 할 사항이다.

 

탐색적 테스팅 부분은 커버하지 못한다

많은 모델 테스팅 전문가들이 이것이 다른 모든 테스팅을 대체할 거라고 주장한다. 나는 최근 10년 동안 경험 기반 테스팅을 통해 많은 것을 배울 수 있었다고 생각한다. 예를 들어, 탐색적 테스팅은 결함을 발견해내는 데 있어 아주 강력한 도구라고 할 수 있다. 어떤 프로젝트에서는 모델 기반 테스팅이 단지 추가되는 전형적인 테스트 기법의 하나일 수도 있고, 또 어떤 프로젝트에서는 적용되는 유일한 테스팅 전략이 될 수도 있다. 모델 기반 테스팅과 탐색적 테스팅은 서로 조합되어 사용될 수 있지만, 생각하는 바에 따라 그 모습이 아주 다양하게 달라질 수 있다. 단지 프로세스에 관한 이야기만은 아니며, 마찬가지로 사람이 성공에 가장 중요한 요소로 작용한다.

 

물론 이 밖에도 모델 기반 테스팅에 대해 심층적으로 논의할 거리들이 있다. 각각의 논의 거리들은 나름대로의 장단점을 가지고 있다. 이번 호의 TE에서 여러분들이 이런 점들을 찾을 수 있으리라 믿는다.

모델 기반 테스팅 수행에 행운이 따르기를 바란다. , 앞서 말한 사실들은 잘 알고 있어야 한다