- Published on
Jasmine & Karma
Jasmine
-
Jasmine은 자바스크립트를 위한 BDD(Behavior Driven Development) 프레임웍이다.
-
아래 코드는 Jasmine으로 작성한 테스트 스크립트이다.
describe('software update check', function () {
var isGetEvent = false;
beforeEach(function (done) {
startDetectWithType(1).then(
function () {
isGetEvent = true;
done();
},
function () {
isGetEvent = false;
done();
}
);
}, 10 * 1000);
it('check get software update event', function () {
expect(isGetEvent).toBeTruthy();
});
});
function startDetectWithType(otaSpec) {
var deferred = $.Deferred(),
timeoutHandle;
var eventType;
swupdate.onUpdateEvent = function (SwUpdateEventInfo) {
eventType = SwUpdateEventInfo.getInfo('event');
if (eventType === EEventDetectSuccess) {
isFoundSW = true;
clearTimeout(timeoutHandle);
deferred.resolve();
} else if (eventType === EEventDetectFail) {
isFoundSW = false;
clearTimeout(timeoutHandle);
deferred.resolve();
}
};
swupdate.startDetectWithType(otaSpec);
timeoutHandle = setTimeout(function () {
deferred.reject();
console.log('Timeout ... ');
}, 10 * 1000);
return deferred;
}
1. Suite
- describe('software update check in ..')를 Suite이라고 부른다. 일반적으로 이것은 애플리케이션의 컴포넌트 혹은 클래스이거나 단순히 여러가지 함수가 될 수 있다.
2. Spec
-
Suite안에서(기술적으로는 클로저의 내부) it()함수를 가지고 있는데 이것을 Spec이라고 부른다. 이것은 프로그램의 일부가 무엇을 해야하는지를 말해주는 자바스크립트 함수다.
-
Spec의 제목인 "check get software update event"도 코드가 아닌 그냥 영어이고 Suite안에는 많은 수의 Spec을 가질 수 있다.
3. Matcher
- 위 예제의 expect(isGetEvent).toBeTruthy()에서 isGetEvent 변수가 true인지를 테스트하는데 이 부분을 Matcher라고 부른다.
- 자스민에는 내장된 많은 수의 Matcher가 있고 필요하다면 자신만의 Matcher를 만들 수 있다.
- 자스민에는 많은 내장 매처들이 있다. toBeNull()은 변수가 null이기를 기대하고 toBeTruthy()는 어떤 값이 true이기를 기대한다. toEqual()은 동등성을 확인하고, toBe()는 정확히 같은 객체인지를 확인한다.
4. before & after
- 모든 스펙이 실행되기 이전에 변수를 설정하거나 함수를 정의하는 등 어떤 동작이 필요하다면 beforeEach()안에 이러한 코드를 둬서 모든 스펙 이전에 실행되게 할 수 있다. 모든 스펙이후에 무언가 실행되기를 원한다면 afterEach()안에 코드를 작성하면 된다.
5. 비동기 처리
-
비동기 처리는 위의 예제와 같이 deferred와 done을 사용하였다.
-
Jasmine에서는 Suite, Spec, beforeEach등에서 done 함수를 제공한다. done을 호출하면 해당 scope를 마치고 넘어갈 수 있다.
-
위의 예제에서는 deferred로 처리한 비동기 작업을 마치면 done을 호출하여 beforeEach를 마치고 it으로 넘어가고 있다.
Karma
-
Karma는 자바스크립트 테스트 러너다.
-
Karma는 유닛테스트용 프레임워크가 아니라 작성한 테스트를 실행해 주는 역할을 한다.
-
그래서 Karma를 사용하더라도 테스트 자체는 기존에 익숙한 QUnit, Mocha, Jasmine을 그대로 사용할 수 있고 테스트 실행만 karma를 이용해서 하게 된다.
-
어떤 테스트 프레임워크를 사용할지는 아래 예제의 frameworks: ["jasmine"] 에서 설정할 수 있다.
-
Karma는 내장된 서버를 가지고 있어, Karma 서버를 실행하고, 원하는 browser로 연결하여 test를 수행하게 된다.
-
어떤 browser를 사용할지는 아래 예제의 browsers: ["Browser"] 에서 설정할 수 있다.
Karma 환경 설정
/*global module */
module.exports = function (config) {
'use strict';
var data;
try {
data = require('../../.individual.json');
} catch (e) {
data = { nfs: './build' };
}
config.set({
basePath: '../..',
frameworks: ['jasmine'],
files: [
'./node_modules/underscore/underscore.js',
'./node_modules/jquery/dist/jquery.js',
'./tests/www/spec/*.spec.js',
'./tests/www/spec/*.html',
],
preprocessors: {},
plugins: [
require('karma-jasmine'),
require('../../lib/Browser'),
require('karma-jenkins-reporter'),
require('karma-junit-reporter'),
require('karma-htmlfile-reporter'),
],
reporters: ['progress'],
junitReporter: {
outputDir: './',
outputFile: 'test_result.xml',
},
htmlReporter: {
outputFile: 'test_result.html',
},
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: ['Browser'],
customLaunchers: {
Browser: {
base: 'BrowserBase',
root: '../..',
data: data,
},
},
proxies: {
'/spec/': '/base/tests/www/spec/',
},
captureTimeout: 600000,
browserNoActivityTimeout: 600000,
singleRun: true,
});
};