들어가며
자, 오늘도 TDD에 대한 얘기입니다. :-)
Mars(마르스 or 마즈, 마스 아님!!) version은 ionic2를 지원하죠.
ionic2는 Angular2를 근간으로 하고 있으며, Angular2의 문법은 Typescript입니다. (꿈과 같은 Google과 Microsoft의 콜라보레이션?)
Mars 미국식 [mɑ:rz] 영국식 [mɑ:z] 화성
Mars [maʀs] 1. 마르스 2. 화성
이런 새로운 환경 하에서 우리는 또 다시 어떻게 하면 TDD를 할 수 있을지를 심각하게 고민해 보아야 합니다.
간단하게 ionic2 test with jasmine으로 검색해 봤습니다.
AngularJs를 공부하면서 신세를 졌던 조쉬 모로니(joshmorony) 사이트가 나오네요.
들어가서 읽어보고 테스트를 해 봅니다.
https://www.joshmorony.com/how-to-unit-test-an-ionic-2-application/
으흠...
테스트 환경을 구축하는 방법이 분리된 post에 정리되어 있네요.
https://www.joshmorony.com/introduction-to-testing-ionic-2-applications-with-testbed/
엄청 깁니다! 그렇지만 포기하지 않고 열심히 따라해 보았습니다.
그런데 이런 된장!! 안되네요...
예제에서 import 하는 일부 class들이 현재와 조금 달라 보입니다.
Angular2 guide에서 찾아보니 이제는 사용하지 않는다네요... OTL
open source라는 게 이렇게 위험합니다 여러분~!! (!true)
...
잠깐 정신을 깨끗하게 하려 해우소에 다녀왔습니다.
어떻게 구글신에게 물으면 원하는 답변을 얻을 수 있을 지 잠깐 고민해 봅니다.
Simple is best!!
'ionic2 unit test' 으로 검색합니다.
ionic2 forum이 보입니다. 아하!!
들어가서 열심히 뒤져봅니다.
건졌습니다!!
http://roblouie.com/article/376/ionic-2-set-up-unit-testing-the-best-way/
몇 가지 수정해야 할 부분이 있지만, guide 거의 그대로 test 가능한 project를 만들 수 있었습니다. :D
Install ionic2
당연히 ionic2 app이 있어야 겠지요.
http://ionicframework.com/getting-started/
물론, 그 전에 node.js가 필요합니다. (# => LTS version을 다운로드 받아 설치해 줍시다.)
install ionic
npm install -g cordova ionic
ionic에는 cordova가 필요하죠. 한 번에 같이 설치하는 명령입니다.
start an app
ionic start {appname} blank
빈페이지를 시작페이지로 갖는 ionic app을 만듭니다. {appname}으로 folder가 생기고 그 아래에 필요한 파일들이 설치됩니다. (대략 150MB)
run your app
ionic serve
app folder로 이동해서 명령어를 실행하면 빈 페이지를 가지는 app이 실행됩니다.
Setup for test
먼저 karma를 설치해야 합니다.
(app folder로 이동해서 실행해주세요.)
npm install -g karma-cli
-g option은 global하게 쓰게 설치하는 option입니다.
그 뒤 테스트에 필요한 module들을 추가로 설치합니다.
npm install --save-dev @types/jasmine@2.5.41 @types/node html-loader jasmine karma karma-webpack ts-loader karma-sourcemap-loader karma-jasmine karma-jasmine-html-reporter angular2-template-loader karma-chrome-launcher null-loader
뭔가 엄청나게 많은 모듈들이 필요하네요.
가만히 보면 webpack, karma, jasmine 이런 녀석들입니다.
karma를 실행하기 위해서는 몇 가지 configuration이 필요합니다.
보통 config.js파일을 미리 만들어 두고, 이를 로드해서 테스트를 수행하는 형태를 띕니다.
아래 파일을 다운로드 받아서, project folder에 'test-config'라는 folder를 만들고 그 아래에 붙여 넣으세요.
앞으로 우리가 만들 test code는 실제로 배포를 할 성질의 것이 아니므로, tsconfig.json파일을 수정해서 exclude하도록 합시다.
준비는 모두 마쳤습니다.
이제 test가 잘 되는지 test해 보죠. :-)
karma start test-config/karma.conf.js
참조한 post에서는 해당 명령어를 package.json파일에 선언해 두고, npm test라는 명령어로 수행했는데, 왠지 저는 안되더라고요. 혹시 solution을 아시면 댓글 남겨주세요.
문제 없이 세팅이 되었다면 아래와 같은 메시지를 보실 수 있을 겁니다.
webpack: Compiled successfully.
webpack: Compiling...
그러면, 이제부터는 unit test code를 만들어 보겠습니다.
Write a test
module로 구성된 Angular2의 기능들 중에서 Service라는 녀석은 공용으로 사용할 library같은 녀석입니다.
그런 역할을 가진 만큼 다른 어떤 module 보다도 테스트의 우선순위가 높은 녀석이라고 생각합니다.
그래서 간단한 기능을 가진 serivce를 만들고, 이를 테스트해 보겠습니다.
(Component module은 test하기 어려워서 대는 핑계입니다...)
파일의 위치는 아래와 같습니다.
book.service.ts
greeting이라는 function을 호출하면 'hello'를 반환하는 기능 밖에는 없는 단순한 service입니다.
실제 service는 보통 ajax call 등을 수행하고 그 결과를 반환하는 역할을 하겠지요.
우리의 경우는 native call이 될 수도 있고요.
Angular2의 서비스는 어디에든 가져다 쓸 수 있게 끔 @Injectable이라는 데코레이션을 달아줘야 합니다. (.net에서는 비슷한 용도의 코드를 attribute라고 불렀던 것 같은데)
book.service.spec.ts
BookSerivce를 참조하기 위해서 import해주었습니다.
서비스는 test 이전에 매번 새로운 instance를 만들도록 beforeEach구문을 통해서 생성해 주었고요.
여기 두 개의 test가 있습니다.
하나는 service가 제대로 instance화 되었는 지를 먼저 확인합니다.
다른 하나는 greeting function이 'hello'를 반환하는 지 확인합니다.
결과가 다음과 같이 나왔습니다.
참고로, test code는 대상 source code와 같은 folder에 위치하고, 그 파일의 이름을 .spec.ts이라고 명명합니다.
왜냐하면, test-config/karma-test-shim.js 파일에 그렇게 찾아서 테스트하라고 정의했거든요.
저는 이제부터 M모 방송사의 POC 앱을 만들러 갑니다.
References
http://roblouie.com/article/376/ionic-2-set-up-unit-testing-the-best-way/
'Javascript' 카테고리의 다른 글
Implement base controller (0) | 2017.07.26 |
---|---|
Service workers. (0) | 2017.07.06 |
npm lite-server (0) | 2017.07.06 |
Calculate distance between two geolocations. (1) | 2017.06.28 |