Mootools 라이브러리가 BDD 프레임워크인 JSSpec을 이용한 자동화된 스펙을 가지고 있는건 이미 유명하지요? 갑자기 Mootools의 스펙이 라이브러리 코드를 얼마나 구석구석 검사하고 있는지 궁금해져서 조금 찾아봤습니다. 코드 커버리지가 왜 필요한지와 같은 내용은 생략합니다.
먼저 자바스크립트(JavaScript) 코드의 커버리지(coverage)를 측정하기 위한 커버리지 측정 도구를 조사해 봤습니다. 브라우저 확장이라던지 자바 언어로 쓰여진 자바스크립트 엔진인 Rhino를 지원하는 커버리지 도구라던지 몇 가지 선택사항이 있지만, 구글 검색 첫 번째 결과인 JSCoverage를 선택했습니다.
데모 페이지의 예제를 돌려보고 문서를 조금 읽어보면 js 파일에 탐침 코드를 삽입하고(instrumentation) 결과를 측정하는 방식을 이용함을 알 수 있습니다. 탐침 코드를 삽입하려면 jscoverage 바이너리를 실행해야 하는데, 공식적으로는 리눅스와 Cygwin이나 Mingw를 이용한 윈도 환경을 지원합니다. 제가 확인한 바로는 맥 OS X 환경에서도 정상적으로 빌드되고 동작합니다.
탐침 코드를 삽입하고 결과를 확인하는 과정은 정말 간단합니다. 다음 형식의 명령어를 실행하면 '탐침코드_삽입된_코드_생성위치'에 탐침 코드가 삽입된 코드와 함께 몇 가지 파일이 더 생성됩니다.
내용이 궁금하다면 원본 코드와 비교해보면 됩니다. 생성된 파일 중 jscoverage.html 파일을 브라우저로 열고 탐침 코드가 삽입된 코드를 실행하면 방금 전 사용자의 행동에 따른 커버리지 정보를 제공합니다. 복잡한 설명보다 이 글을 작성하게된 목적인 Mootools 라이브러리의 스펙이 라이브러리를 얼마나 구석구석 확인하고 있는지 보겠습니다.
JSSpec이 포함된 Mootools를 다운로드받으려면 Github에서 호스팅 중인 코드를 받아야 합니다. 가장 최신 버전인 1.2.1 태그를 받았습니다. 압축을 해제하면 Source 폴더에 Mootools 코어 라이브러리의 js 파일들이 있고, Specs 폴더에 JSSpec 스펙 코드가 있습니다. Specs 폴더의 index.html을 브라우저에서 실행하면 스펙이 동작하면서 성공, 실패에 대한 결과를 보여줍니다.
그림1. Mootools 라이브러리의 JSSpec 실행 결과 화면
여기서 궁금했던 건 100% 성공인데 과연 라이브러리의 대부분을 확인한 100% 성공인가였습니다. 그래서 JSCoverage를 이용해 탐침 코드를 삽입하고 결과를 확인해 보겠습니다. 스펙 코드가 얼마나 구석구석 실행됐는지 궁금한게 아니라 스펙이 라이브러리 코드를 얼마나 구석구석 실행했는지를 알고 싶으므로 라이브러리 코드에 탐침 코드를 삽입합니다.
Source 폴더의 js 파일들에 탐침 코드가 삽입된 결과가 Instrumented 폴더에 생성됩니다. Specs 폴더의 스펙이 Source 폴더를 참조하므로 Source 폴더를 옮겨두고 Insturumented 폴더를 Source 폴더로 옮겨둡니다. 이제 Source 폴더에서 생성된 jscoverage.html 파일을 실행합니다. URL 필드에 탐침 코드가 삽입된 자바스크립트를 실행하는 html 파일의 주소를 연결하고 Go버튼을 눌러 동작합니다. 여기서는 Specs/index.html 파일이 모든 스펙을 실행하고, 스펙에서 탐침 코드가 삽입된 자바스크립트 파일을 실행합니다.
그림2. 탐침 코드가 삽입된 라이브러리 코드 실행
스펙의 수행이 끝난 후 Summary 탭에서 커버리지 결과를 확인할 수 있습니다. Mootools 스펙의 실행 결과를 보면 전체 45%의 구문 커버리지(statement coverage)를 달성했으며 파일의 이름만으로도 이벤트, 효과, HTML/JSON 요청 처리, 유틸리티 관련 코드에 대한 명세가 부족함을 유추할 수 있습니다. js 파일의 링크를 클릭하면 실제 소스에서 수행된 영역과 수행되지 않은 영역에 대한 정보도 제공합니다.
화면3. Mootools 스펙이 확인한 라이브러리 코드의 커버리지
이외에도 프레임 안에서 실제 페이지를 동작할 수 없는 등의 상황에 기존 방식으로 웹 페이지를 실행하고 커버리지 확인 페이지를 열어서 확인할 수 있도록 한 인버트(invert) 모드의 지원, 서버를 실행해서 동작하는 방법, 자동으로 결과 페이지를 저장하게 만드는 방법 등 여러가지 수행 옵션을 제공하고 있습니다.
JSSpec은 우리나라 소프트웨어라는 점에서 관심을 가지고 가끔 관련 자료를 찾아보고 있습니다. 자동화된 테스트의 생성이 얼마나 어려운지 알고 있기에 Mootools의 스펙이 어느 정도로 깊이 있게 확인하고 있는지 궁금해져서 잠시 확인해 봤습니다. 덕분에 자동화하기 어려운 부분을 명확하게 알게 됐습니다. Mootools 라이브러의 스펙이 일부 부족한 점은 있겠지만 개인적으로는 이 정도 수치는 꽤나 높은 수치라고 봅니다. 자칫 전체 커버리지 숫자만으로 평가절하하지 않았으면 합니다.
궁금증도 해결했지만 JSSpec 스펙 작성과 동작을 돕고 커버리지까지 측정해 주는 이클립스 플러그인 개발 아이디어가 떠올랐습니다. JSSpec2의 개발소식에 잠시 지켜봐야 겠네요.