Javascriptのテスト用ツールには、MochaやChaiなどいろいろあります。
今回は多様なテストツールの中でも、Facebook製のjestというフレームワークを導入して使ってみます。
jestとは
Jest · 🃏快適なJavaScriptのテスト
https://jestjs.io/ja/
Jest is a delightful JavaScript Testing Framework with a focus on simplicity.
It works with projects using: Babel, TypeScript, Node, React, Angular, Vue and more!
Jestはシンプルで、Babel、Typescript、Node、React、Angular、Vueなどに対応しています。
前提
今回はTypescriptプロジェクトにjestをインストールする想定です。
導入手順
Getting Started · Jest
https://jestjs.io/docs/ja/getting-started.html
Jestの公式ページ
インストール
$ npm install --save-dev jest @types/jest ts-jest
package.jsonの編集
必要な編集作業は2つです
-
npm run test
を入力時に、jestを実行する - ts拡張子のファイルをjestの対象にする
{
"scripts": {
...
...
"test": "jest"
},
"jest": {
"moduleFileExtensions": [
"ts",
"js"
],
"transform": {
"^.+\\.ts$": "ts-jest"
},
"globals": {
"ts-jest": {
"tsConfig": "tsconfig.json"
}
}
},
}
テストコードを配置するディレクトリ作成
__test__
以下にテストコードを配置します。
src
以下にコードを配置します。
テストコードの書き方
非同期関数をテストする
今回は、aws-sdkを用いた関数をテストしてみます。
IAM RoleのAPIを叩いてRole Nameが含まれた配列を返す関数をテストします。
テストコード用構文
テストコード内に、テスト用の書き方があるので、いくつか紹介します。
すでにテストをある程度書いた経験がある方は飛ばしてもらって構いません。
- describe
- テスト箇所の宣言をします。
- it
- テスト内容を記述する場所です。
- jestでは、testとも書けます。
- expect
- テスト対象を指定して、実行結果をテストします。
テストコード
関数の実行結果に、ec2-roleというロール名が含まれるかどうかテストしています。
ec2-roleを、ご自身のAWSアカウントに登録されているRole名へ変更すれば流用することができます。
非同期関数のテスト
jestではasync、await構文が使えるので、それらを用いてテストしています。(itの部分です)
./__tests__/index.spec.ts
import { IAMRoleNameCollector } from '../src/index';
import { IAM } from 'aws-sdk';
describe('the test of IAMRoleNameCollector', () => {
const iam = new IAM;
const iamRoleNames = new IAMRoleNameCollector(iam);
it('test', async ()=> {
const result = await iamRoleNames.listRoleNames();
expect(result).toConatin('ec2-role');
})
})
- テスト対象の関数が含まれる関数
./src/index.tx
import { IAM } from "aws-sdk";
export class IAMRoleNameCollector {
readonly iam: IAM
roleNames: null | Promise<any>;
constructor(iam: IAM) {
this.iam = iam;
this.roleNames = null;
}
async listRoleNames () {
return this.roleNames = await this.iam.listRoles()
.promise()
.then(data => {
return data.Roles.map(roleInfo => {
return roleInfo.RoleName
})
})
.catch(err => {
return err;
}
)
}
}
テストの実行
いよいよ、テストを実行してみます。
下記コマンドを入力すると、テストが実行されて結果が表示されます。
$ npm run test
> XXXXX@1.0.0 test /Users/XXX/Documents/XXXXX
> jest
PASS __tests__/index.spec.ts (7.146s)
the test of IAMRoleNameCollector
✓ test (896ms)
console.log src/index.ts:60
[
'ec2-role',
]
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 8.517s
Ran all test suites.
まとめ
今回はjestを使ってかんたんに非同期関数をテストしてみました。
公式リファレンスも充実しているので、他に気になったことがあればぜひ参考にしてみてください。
Getting Started · Jest
https://jestjs.io/docs/ja/getting-started