테스트 코드 작성을 위한 라이브러리
다양한 테스트 관련 라이브러리들 중에 어떠한 것이 적합한지에 대해 고려하여 판단을 해야하는 데.. 일반적으로 다음과 같은 기능을 제공해야한다.
- 구조적인 테스트를 제공한다(Mocha, Jasmine, Jest).
- 테스트 결과를 보여준다(Mocha, Jasmine, Jest, Karma).
- 단언문을 제공한다(Chai, Jasmine).
- 목, 스파이, 스텁 등을 지원한다(Sinon.JS, Jasmine).
- 코드 커버리지 리포트를 생성한다(Istanbul).
이 중에 Frontend 테스트 환경 구축을 위한 대표적인 테스팅 프레임워크로는 Mocha, Jest, Jasmine 이 있다.
테스트 러너(브라우저에서 테스트를 수행하기 위한 것 같음)로는 Karma가 대표적이다.
실제로 검색을 해보거나 웹팩 템플릿을 이용하여 프로젝트를 구성하다보면 아래와 같은 조합들을 확인 가능한 것 같다. (보통 테스트러너 + 프레임워크 조합으로 구성하는 것 같다)
- Jasmine + Karma
- Mocha + Karma
Chai
Chai를 사용하면 결과 값에 대하여 비교할 때에 Assertion을 이용하여 기대 값을 비교할 수 있다.
테스트 코드 작성해보기
Mocha + Karma 조합으로 테스트 환경을 구성해보았다.
환경 구축
Mocha와 Chai 라이브러리를 설치한다.
yarn add -D mocha chai
Karma 라이브러리를 설치한다.
yarn add -D karma karma-mocha karma-chrome-launcher
유틸리티 코드 작성
import reduce from 'lodash/reduce';
import find from 'lodash/find';
const role = (() => {
const ROLES = {
SUPER_ADMIN: { value: '1', text: 'app.users.role.superAdmin' },
OPERATOR: { value: '2', text: 'app.users.role.operator' },
WATCHER: { value: '3', text: 'app.users.role.watcher' },
};
return {
defaultRole: ROLES.WATCHER,
roleList() {
return reduce(
ROLES,
(result, item) => {
result.push(item);
return result;
},
[],
);
},
getRole(val) {
return find(ROLES, { value: val.toString() });
},
getRoleName(val) {
return find(ROLES, { value: val }).text;
},
isSuperAdmin(id) {
return ROLES.SUPER_ADMIN.value === id;
},
};
})();
export default role;
테스트 코드 작성
import { expect } from 'chai';
import role from '@/utils/role';
describe('util.role', () => {
describe('roleList', () => {
it('get all role List', () => {
const list = role.roleList();
expect(list.length).to.equal(3);
});
it('get role by Id typed Number', () => {
const roleId = 1;
const roleName = role.getRole(roleId);
expect(roleName.value).to.equal(roleId.toString());
expect(roleName.text).to.include('superAdmin');
});
it('get role by Id typed String', () => {
const roleId = '2';
const roleName = role.getRole(roleId);
expect(roleName.value).to.equal(roleId);
expect(roleName.text).to.include('operator');
});
});
});
테스트 코드 수행
$ vue-cli-service test:unit
WEBPACK Compiling...
DONE Compiled successfully in 1759ms
WEBPACK Compiled successfully in 1759ms
MOCHA Testing...
util.role
roleList
✓ get all role List
✓ get role by Id typed Number
✓ get role by Id typed String
3 passing (10ms)
MOCHA Tests completed successfully
Done in 3.85s.
Process finished with exit code 0
Karma 설정 파일 생성
$ karma init
Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> mocha
Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no
Do you want to capture any browsers automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> Chrome
>
What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
> tests/**/*.spec.js
>
Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
>
Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes