JavascriptのテストフレームワークJestを導入して、非同期関数をテストする


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の対象にする
package.json

{
  "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

./__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 

> [email protected] 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