1. 인수 테스트의 정의
인수 테스트(Acceptance Test)은 명세화된 요구사항이 충족되었는지 확인하는 테스트이다. 인수 테스트는 단위 테스트(Unit Test)와 달리 단위 기능이 아닌 비즈니스 기능 검증을 대상으로 한다. 각 비즈니스 기능들은 서로 다른 팀이 서로 다른 환경에 독립적으로 구현되는 경우가 많으므로 이들 비즈니스 기능의 상호작용에 대한 테스트도 인수 테스트의 대상이다. 예를 들어, 비즈니스 기능이 서로 다른 서버에 구현되는 경우, 이들 기능들이 제대로 상호작용할 수 있는지 인수 테스트 단계에서 확인할 수 있다. 인수 테스트는 프로그래머 혹은 테스터 뿐만 아니라 고객과 같은 다양한 이해 관계자가 함께 수행한다는 점에서 단위 테스트와 구별된다. 표 1은 단위 테스트와 인수 테스트의 차이점을 나타낸 것이다.
표 1. 단위 테스트와 인수 테스트의 차이점
|
단위 테스트 (Unit Test) |
인수 테스트 (Acceptance Test) |
검증 대상 |
단위 기능 검증 |
비즈니스 기능(요구사항) 검증 |
수행자 |
프로그래머 |
프로그래머, 테스터, 고객 등 다양한 이해관계자 |
2 인수 테스트 자동화 도구 필요성
전통적으로 인수 테스트는 QA(Quality Assurance) 팀이 직접 수행하였으나, 수동적인 테스트에 과도한 인력이 투입되어 비용이 증가하는 문제가 나타났다. 이를 해결하기 위하여 테스트 자동화 도구 도입의 필요성이 대두되었는데, Fit, Selenium 등과 같은 다양한 인수 테스트 자동화 도구들이 등장하였다.
인수 테스트 자동화 도구의 필요성은 최근 여러 회사에 도입되고 있는 스크럼과 같은 애자일 개발 프로세스에서도 그 근거를 찾을 수 있다. 애자일 개발 방법론에서는 사용자 스토리 기반의 기능 테스트를 인수 테스트라고 부르는데, 이는 고객과 함께 개발 주기에 스토리를 결정하고 스토리의 기능을 테스트하는 것을 말한다. 그런데 애자일 개발 프로세스에서는 개발 주기가 짧으므로 빈번하게 인수 테스트를 해야 하기 때문에 인력 투입과 비용 절감을 위하여 인수 테스트를 자동화해야 할 필요성이 크다.
3 Fit과 FitNesse
Fit(Framework for integrated test)은 고객 입장에서의 테스트를 자동화하여 인력 투입을 줄이고자 만들어진 테스팅 프레임워크이다. Fit은 위키의 개념을 창시한 워드 커닝햄(Ward Cunningham)이 소프트웨어 개발 시에 협업을 강화하고 이해관계자들의 의사소통을 돕기 위한 목적으로 개발한 프레임워크이다. 이 프레임워크의 근본적인 취지는 고객, 테스터, 프로그래머 등 여러 이해관계자들이 요구사항을 공유하는 것이다. 사용자의 테스트 항목과 결과로 기대되는 값을 미리 기술하고, 테스트를 자동으로 실행하여 얻은 실제 결과 값과 기술된 기대 값을 비교하여 같으면 초록색으로, 다르면 붉은색으로 나타내 이해관계자들이 테스트 결과를 쉽게 인지할 수 있다. HTML 포맷으로 테스트 항목과 테스트 입력값을 작성하면 Fit이 이를 읽고 프로그램 실행 시 매개변수로 넣어 결과값을 얻은 뒤 다시 HTML 포맷으로 컬러링을 하게 된다. 초기의 Fit은 Java 프로그램만을 실행할 수 있었으나 이것이 .Net 프레임워크로 확장되면서 서로 다른 언어로 작성된 프로그램 간에 동일한 테스트를 수행하는 것도 가능해졌다. 현재는 Java, .NET, Python, Perl, Smalltalk, C++, Ruby, Delphi 등 다양한 언어의 플러그인들을 지원하고 있으며, Fit을 기반으로 한 여러 서드파티 도구들이 개발되어 있다. 그러나 현재 Fit의 개발은 정체되어 있는 상태이다.
FitNesse는 Fit에 위키를 결합하여 웹 서버 형태로 제공되는 오픈소스 인수 테스트 자동화 도구이다. 공식 홈페이지에서 jar 파일을 내려 받아 설치나 설정 없이 간편하게 바로 웹 서버를 실행하여 사용할 수 있다. 또한 위키 형태의 페이지를 계층적으로 작성할 수 있고, 페이지에 실행 프로그램 파일의 경로와 테스트 항목, 기대값을 입력하면 단순한 버튼 클릭만으로 프로그램을 실행하여 실제 결과값을 얻은 후 비교할 수 있다. 기대와 다른 결과값이 나온 경우 다른 색(붉은색)으로 표현하여 고객들이 결과를 쉽게 인지할 수 있도록 한다. 이와 같은 자동화된 절차를 통해 고객과 개발자 등 이해관계자의 협업을 돕게 된다. FitNesse는 현재 Java와 Python, C# 등 세 가지 언어로 작성된 소프트웨어만을 테스트할 수 있도록 지원하고 있다.
4 FitNesse의 동작 과정
기존 FitNesse는 Fit 테스트 엔진을 사용하고 있었으나 최근 더 이상 Fit 테스트 엔진에 의존하지 않기 위하여 Slim(Simple List Invocation Method)이라는 테스트 엔진을 새롭게 도입해 진화하고 있다. Slim 도입으로 플랫폼 간 호환성이 더욱 높아지게 되었다. 그러나 기존 사용자를 위하여 Fit 테스트 엔진과 Slim 테스트 엔진을 동시에 지원하고 있다.
FitNesse와 Slim을 결합한 시스템은 FitNesse, SlimService, Fixture 등 총 세 부분으로 나누어 볼 수 있으며, 동작 과정은 다음과 같다.
1) 고객이 Test Case를 만들어 위키 페이지에 Decision Table 포맷으로 입력값과 기대값을 입력한다.
2) FitNesse가 위키 페이지의 텍스트를 파싱하고 테스트 컨트롤을 한다.
3) SlimService는 프로그래머가 미리 만들어 놓은 Fixture 클래스 실행 파일을 찾고 실행한다.
4) Fiixture 클래스에는 파싱한 입력값을 매개변수로 받는 set 함수들과, 비즈니스 로직에 해당하는 클래스의 인스턴스를 생성하고 그 클래스의 함수를 호출하는 함수가 포함되어야 한다.
5) FitNesse가 결과를 받아 실제 결과값과 기대값을 비교하여 같으면 녹색으로, 다르면 빨강색으로 색칠한다.
기존 Fit 테스트 엔진을 사용하였을 때에는 FitNesse는 단순히 페이지를 렌더링하기만 하고 텍스트 파싱은 FitServer에서 수행하고 결과의 해석에 대한 부분은 Fixture에 구현해 놓아야 했으나, Slim에서는 상당수의 작업을 FitNesse 자체에 위임하여 프로그래머가 Fixture를 구현하기 쉬워졌다. 아래는 FitNesse와 Fit 엔진 또는 Slim 엔진을 사용한 과정을 도식화한 것이다.
그림 2. FitNesse와 Fit/Slim 테스트 엔진 사용 과정 (출처: http://fitnesse.org/)
5 FitNesse의 장점
FitNesse의 장점은 다음과 같다. 첫째로, 고객이 프로그래밍에 대한 지식이 없어도 테스트가 가능하다. 프로그래머가 Fixture라는 클래스를 미리 만들어 Test Harness 또는 각 서비스 간의 인터페이스를 제공한다. 고객은 위키 페이지에 사용자 입력값과 기대값을 Decision Table이라는 테이블 포맷으로 입력하기만 하고 버튼을 눌러 결과값 비교만 확인하면 된다. 이와 같은 프로그래밍의 분리를 통해, 프로그래밍을 할 줄 모르는 고객들이 인수 테스트에 더 효과적으로 참여하도록 유도할 수 있다. 둘째로, 사용자로부터 피드백을 빨리, 그리고 자주 얻을 수 있다. FitNesse를 통해 인수 테스트를 하면서 개발 초기부터 요구사항 검증이 가능해지며, 자동화된 테스트를 통해 결과를 편리하게 확인할 수 있다.
표 2. 고객과 프로그래머의 역할 분담
고객 |
프로그래머 |
위키 페이지에 Decision Table 입력 l 입력 받을 변수 목록 l 테스트 항목(입력값, 기대값) |
Fixture 클래스 구현 l 각 변수에 대한 Set 함수 l 변수를 매개변수로 사용해 이미 구현된 비즈니스 로직을 실행하는 함수 |
Excel과 같은 스프레드시트 도구 사용하여 작성하므로 프로그래밍 몰라도 됨 |
고객의 요구사항을 매개변수들의 수치로 받게 되므로 프로그래밍 순조로움 |
각자가 이해할 수 있는 범위에서 분업하여 효율성 증대 FixNesse라는 동일한 수단을 통해 서로 간 커뮤니케이션 증대 |
6 사용법 튜토리얼
이번 절에서는 첨부된 파일들을 사용하여 FitNesse의 다운로드부터 간단한 사용 예제까지 따라가며 확인할 수 있는 사용법 튜토리얼을 소개한다. (튜토리얼에 사용한 소스는 아래 링크에서 내려받을 수 있다.)
테스트 시나리오 |
현재 보유한 현금, 집에 남은 우유의 양, 신용카드 보유 여부에 따라 우유를 사야 갈지 말지 결정하는 요구사항이 제대로 구현되었는지 인수 테스트를 하려고 한다. 프로그램은 이클립스 도구를 사용하여 Java로 구현되었다.
위 기능에 관련된 클래스는 BuyingMilkDecision 클래스이며, 구성은 다음과 같다. l 변수 cashInWalllet (보유 현금의 양), pintsOfMilk (남은 우유의 양), creditCard (신용카드 보유 여부) l 함수 goToStore (남은 우유의 양이 0이고, 보유 현금이 2 이상이거나 신용카드 보유가 1이면 우유를 사러 간다)
고객은 다음과 같은 상황에서 비즈니스 로직이 올바르게 동작하는지 테스트하려고 한다. l 보유 현금 0, 신용카드 0, 남은 우유 0이면 no 출력 l 보유 현금 10, 신용카드 0, 남은 우유 0이면 yes 출력 l 보유 현금 0, 신용카드 1, 남은 우유 0이면 yes 출력 l 보유 현금 10, 신용카드 1, 남은 우유 0이면 yes 출력 l 보유 현금 0, 신용카드 0, 남은 우유 1이면 no 출력 l 보유 현금 10, 신용카드 0, 남은 우유 1이면 no 출력 l 보유 현금 0, 신용카드 1, 남은 우유 1이면 no 출력 l 보유 현금 10, 신용카드 1, 남은 우유 1이면 no 출력 |
1) FitNesse 다운로드 및 웹 서버 실행
FitNesse 공식 홈페이지 (http://fitnesse.org/FitNesseDownload/) 에 접속하여 fitnesse-standalone.jar 파일을 다운로드하여 적당한 폴더에 넣는다.
다운 받은 FitNesse 서버를 실행하기 위하여 해당 폴더에서 커맨드 창을 열고 다음과 같이 입력한다.
java –jar fitnesse-standalone.jar –p 포트번호
조금 기다린 후 웹브라우저 창에 http://localhost:포트번호 를 입력하면 접속이 되는 것을 확인할 수 있다.
2) 고객이 Decision Table을 작성한다. Decision Table을 작성하기 전 프로그래머와 회의하여 매개변수로 입력 받을 변수들과 함수들, 그리고 fixture 클래스의 이름 정해야 한다. Decision Table은 Excel 등 스프레드시트 도구로 작성할 수 있다. 고객은 각 테스트 항목마다 변수에 들어갈 값들을 지정하고, 실행 결과로 기대되는 값을 적어야 한다. 아래 그림에서는 CashInWallet, CreditCard, PintsOfMilk에 숫자를 입력받고 있다. 함수명에 ‘?’를 붙이면 해당 함수를 fixture 클래스에서 찾아 실행하게 되는데, 여기에서는 fixture 클래스의 goToStore 함수를 실행하게 된다.
3) 프로그래머는 fixture 클래스를 작성하여 테스트할 클래스와 함께 컴파일한다. Fixture 클래스에는 다음과 같은 내용이 있어야 한다.
* 매개변수로 사용될 변수들의 set 함수
* 테스트할 클래스의 인스턴스를 생성하고 매개변수를 넣어 테스트할 함수를 실행하는 함수
4) 위키 페이지 작성
위키 페이지 작성은 위키의 특성을 활용하여 계층적으로 만들 수 있다. 즉, 큰 기능 테스트 페이지안에 세부 기능 테스트 페이지들을 만드는 것이 가능하다. 각 페이지로의 링크는 단순히 Edit을 눌러 새롭게 만들 페이지 제목을 입력하면 된다.
FrontPage에서 Edit을 눌러 아래 쪽에 BuyingDecison이라는 글자를 입력하고 Save를 누르면 글자 옆에 페이지를 생성할 것인지 물어보는 링크가 나온다.
다음과 같이 링크를 눌러 BuyingDecision이라는 큰 기능에 속한 세부 기능을 테스트하는 페이지들을 만들 수 있다. 이 세부 기능들을 한꺼번에 테스트하는 페이지를 만들 수도 있다.
BuyingMilkDecision 페이지를 생성하여 다음과 같이 사용할 테스트 엔진명과 프로그램 실행 파일 경로, fixture 클래스의 패키지명을 입력한다.
이후 고객은 페이지 아래 쪽에 Excel로 만들었던 Decision Table을 복사해 붙여 넣고 ‘Spreadsheet to FitNesse’ 버튼을 눌러 손쉽게 포맷을 변경할 수 있다. 다음과 최종 완성된 페이지 내용을 확인하고 save 버튼을 누른다.
5) 테스트 실행
테스트를 실행하기 위해서는 페이지가 test page로 설정되어 있어야 한다. 원래는 페이지 생성 시 test page를 선택하도록 되어 있으나, 현재는 선택을 해도 변경되지 않기 때문에 수동으로 test page로 바꾸어야 한다. 다음과 같이 Tools > Properties 메뉴를 클릭해 Page type을 Test로 바꾼다.
다음과 같이 Test 버튼이 생긴 것을 볼 수 있다. Test 버튼을 누르면 자동으로 테스트가 실행된다.
테스트를 실행하면 다음과 같이 기대 값과 비교하여 같으면 녹색으로 칠하고, 다르면 빨강색으로 칠해서 보여준다. 그림에서는 실행 결과는 no인대 기대 값을 yes를 입력해 놓은 상태라서 다르다고 표시된 것이다. yes를 no로 수정하면 녹색으로 변하게 된다.
7 맺음말
지금까지 FitNesse를 활용한 인수 테스트에 대하여 알아보았다. 인수 테스트는 단위 테스트와 달리 요구사항에 기반하여 고객이 함께 테스트를 수행해야 하기 때문에 프로그래밍에 대한 지식이 없어도 테스트를 작성하고 실행할 수 있어야 하지만 개발 중에 사용자 인터페이스 등이 아직 개발이 되지 않은 경우에는 확인하기 어렵다. 또한 각 비즈니스 기능이 서로 다른 서버에 구현되어 있는 경우 이들을 통합한 테스트가 어려울 수 있다. 이러한 문제를 해결하기 위하여 FitNesse는 위키 형태의 웹 서버를 제공하여 이해관계자들이 효율적으로 협업하고 의사소통할 수 있게 한다. FitNesse를 실제로 업무에 적용한 사례는 참고 링크 [4]의 “넥스트리 FitNesse 적용사례 관련 블로그 포스트”에서 확인할 수 있다.
참고 링크
[1] FitNesse 공식 홈페이지 http://fitnesse.org/
[2] Fit 공식 홈페이지 http://fit.c2.com/
[3] FitNesse User Guide http://butunclebob.com/.FitNesse.UserGuide
[4] 넥스트리 FitNesse 적용사례 관련 블로그 포스트 http://www.nextree.co.kr/p2613/
[5] Fit의 종말과 FitNesse에 대한 워드 커닝햄의 견해 녹음본 http://www.hanselminutes.com/151/fit-is-dead-long-live-fitnesse-with-ward-cunningham-and-james-shore
[6] Slim과 FitNesse의 미래에 대한 강의자료 http://gojko.net/resources/slim.pdf
[7] 위키피디아 FitNesse 항목 http://en.wikipedia.org/wiki/FitNesse
'IT' 카테고리의 다른 글
How to Set Up Samsung Gear Development Environment (0) | 2015.04.06 |
---|---|
Protege 튜토리얼 03: 프로테제와 OWL Ontology (1) | 2015.01.08 |
Protege 튜토리얼 02: 프로테제 메뉴 살펴보기 (2) | 2015.01.08 |
Protege 튜토리얼 01: 프로테제 개요 & 설치 (0) | 2015.01.08 |
Sommerville 교재 문답 40 (0) | 2014.12.17 |
댓글