TypeScript を使って Alexa Custom Skills を作ろう 番外編 カバレッジ

# はじめに

前回投稿した[機能テスト編](https://qiita.com/daisukeArk/items/9abda17f2bf79ca6357e)では、`alexa-conversation`を利用した機能テストについてご紹介しました。

本投稿では、[単体テスト](https://qiita.com/daisukeArk/items/afa12708810a6b0b0fde)・[機能テスト編](https://qiita.com/daisukeArk/items/9abda17f2bf79ca6357e)で作成したテストによって、スキルの実装コードがどれくらい網羅されているかを計測する為の方法をご紹介します。

# カバレッジ計測ライブラリについて

今回は、情報量が多そうな`istanbul`を選択しました。

[istanbul](https://www.npmjs.com/package/istanbul)

# カバレッジを見てみよう

## ライブラリのインストール

```bash:移動
$ cd ~/custom-skill-sample-to-convert/skill/lambda/custom
```

```bash:istanbulのインストール
$ npm install --save-dev istanbul
```

## package.jsonの修正

テストを実行する為のスクリプトを`package.json`に定義します。

* `tsc`コマンドでトランスパイル
* `istanbul`でカバレッジ計測
* `mocha`で`./dist/tests`ディレクトリ配下のテストファイルを再帰的にテスト

```json:package.json
"scripts": {
  "test": "tsc && istanbul cover --print both $(npm bin)/_mocha --recursive $(find ./dist/tests -name '*.test.js')"
},
```

## テスト実行

```bash:テスト実行
$ npm test
```

```bash:結果
Warning: Application ID is not set
  first-utteranceクラスのテスト
    メッセージが正しく取得できること
      ✓ インスタンスが作成されていること
      ✓ 想定した発話が返されること

  Executing conversation: タイろう　テスト
    ✓ Finished executing conversation

  Conversation: タイろう　テスト
    User triggers: AMAZON.HelpIntent
      ✓ Alexa's plain text response should equal: 声を聞かせて、と言ってください。


  4 passing (53ms)

=============================================================================
Writing coverage object [~/custom-skill-sample-to-convert/skill/lambda/custom/coverage/coverage.json]
Writing coverage reports at [~/custom-skill-sample-to-convert/skill/lambda/custom/coverage]
=============================================================================
-------------------------|----------|----------|----------|----------|----------------|
File                     |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
-------------------------|----------|----------|----------|----------|----------------|
 dist/                   |    92.31 |       50 |      100 |    92.31 |                |
  index.js               |    92.31 |       50 |      100 |    92.31 |             11 |
 dist/enums/             |      100 |      100 |      100 |      100 |                |
  handler-state-types.js |      100 |      100 |      100 |      100 |                |
 dist/handlers/          |    40.82 |    33.33 |     5.26 |    48.78 |                |
  first-handler.js       |    33.33 |    33.33 |        0 |    45.45 |... 29,34,37,40 |
  new-session-handler.js |     62.5 |      100 |    33.33 |     62.5 |         7,8,14 |
  start-handler.js       |    45.45 |      100 |        0 |    45.45 |8,9,12,15,18,21 |
 dist/intents/           |      100 |      100 |      100 |      100 |                |
  help-intent.js         |      100 |      100 |      100 |      100 |                |
  intent-base.js         |      100 |      100 |      100 |      100 |                |
 dist/models/            |    28.57 |        0 |       50 |    28.57 |                |
  news-repository.js     |    28.57 |        0 |       50 |    28.57 | 20,25,26,27,30 |
 dist/utterances/        |     87.1 |    90.91 |       90 |      100 |                |
  first-utterance.js     |    84.62 |    90.91 |    88.89 |      100 |                |
  language-strings.js    |      100 |      100 |      100 |      100 |                |
  utterance-base.js      |      100 |      100 |      100 |      100 |                |
-------------------------|----------|----------|----------|----------|----------------|
All files                |    65.79 |    61.54 |    42.86 |    72.45 |                |
-------------------------|----------|----------|----------|----------|----------------|


=============================== Coverage summary ===============================
Statements   : 65.79% ( 75/114 )
Branches     : 61.54% ( 16/26 )
Functions    : 42.86% ( 15/35 )
Lines        : 72.45% ( 71/98 )
================================================================================
```

前回までの投稿では、一部の機能のテストしか行っていない為、以上の結果となりました。

# まとめ

カバレッジ率を計測することで、実装コードをどれくらいテストしたか・まだテストしきれていないコードがどのくらいあるのかが判断しやすくなります。
また、隈なくテストをすることでテストの質を良くし、品質を図る指標にも使えると思います。

今回のソースは以下にあります。
[カバレッジ](https://github.com/daisukeArk/custom-skill-sample-to-convert/tree/dev/coverage)