【Elixir】Visual Studio CodeとExUnitを連携させて失敗ケースを一覧表示、ジャンプ、マークする

# ゴール

- ![スクリーンショット_123015_053623_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/726c7acc-4b20-3a0e-525f-b67e76e5fba1.jpeg)
    - エディタ内でテスト実行、結果表示を完結（画像右側）。
    - 失敗ケースの宣言行にマーク（画像左側）。
        - マウスオーバーによるメッセージの表示。
- できていないこと
    - アサーションに失敗した行番号の情報取得、紐付け。
- 不具合？
    - たまにテスト実行が行われず、マークだけ消えることがある。
        - Outputを見れば一目瞭然なので気付くことはできる。

# 想定

- Visual Studio CodeとExUnitの基本的な使い方を知っており、セットアップ済み。
- エディタ内で完結する形で、ExUnitとの連携を試してみたい人向け。
- 所要時間3～5分。

# 書いた人の環境

- Windows 10
- Visual Studio Code 0.10.6
- Elixir 1.1.0
    - Web Installerでセットアップ。

# 前提

- プロジェクトのルートディレクトリで `$ mix test` が正しく実行できる。
    - `$ mix new` でプロジェクト作成していれば多分OK。
- ExUnitの出力形式などを変更していない。
    - Elixirをセットアップしたままの状態ならOK。
- Visual Studio Codeでプロジェクトのルートディレクトリを開いている。
    - `Ctrl+Shift+E` で表示されるExplorerに `Open Folder` のボタンが無ければOK。
    - ![スクリーンショット_122915_090249_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/fcb2d644-d8fc-f9fa-3801-cd3a0554f3da.jpeg)

# 試す

- プロジェクトのルートに生成される `.vscode` フォルダの中にある、 `tasks.json` ファイル（UTF-8）を、以下の内容で**全て上書き**する。
    - フォルダとファイルが無い場合
        - ビルドかテストのタスク実行( `Ctrl+Shift+B` or `Ctrl+Shift+T` )をすると、以下の様な表示がされる。
        - ![スクリーンショット_123015_062254_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/0b2019f3-c299-893c-03ed-fd734151cdf6.jpeg)
        - 右側のConfigure Task Runnerをクリックすると、フォルダとファイルが生成される。

```:.vscode/tasks.json
{
  "version": "0.1.0",
  "command": "mix",
  "isShellCommand": true,
  "showOutput": "always",
  "tasks": [
    {
      "taskName": "test current",
      // Assign this task as "Test Task". Ctrl+Shift+T (default) to run.
      "isTestCommand": true,
      "suppressTaskName": true,
      "args": [
        "test",
        "${file}"
      ],
      "echoCommand": true,
      "problemMatcher": {
        "owner": "elixir",
        "fileLocation": ["relative", "${workspaceRoot}"],
        "pattern": [
          {
            "regexp": "\\s*\\d+\\).*\\(.*\\)$"
          },
          {
            "regexp": "\\s+([^:]*):(\\d*)$",
            "file": 1,
            "line": 2
          },
          {
            "regexp": "^\\s+(.*)$",
            "message": 1
          }
        ]
      }
    }
  ]
}
```

- 何かしらのアサーションが失敗するようにしておく。
- **テストコードのファイルを開いているエディタをアクティブにする。**
- `Ctrl+Shift+T` あるいは `Ctrl+P`で表示されるパレットに`task test current`と入力すると、アクティブなエディタで開いているファイルのパスを渡してテストが実行される。
- 終わるまで眺める。
    - エディタのウィンドウ左下にある表示 ![スクリーンショット_122915_082732_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/531463ff-377b-db64-da7f-c8d4280883f6.jpeg) の左で記号がクルクルしていたら処理中。
    - Output ビューが表示される。
        - ![スクリーンショット_123015_054817_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/fb0058b3-ebd3-d901-093a-cd0744a6c2cf.jpeg)
    - ![スクリーンショット_122915_082732_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/531463ff-377b-db64-da7f-c8d4280883f6.jpeg) の数値が変わる。![スクリーンショット_123015_064126_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/c6c4180a-80e7-f591-afdc-85cbfca98563.jpeg)
- ![スクリーンショット_123015_064126_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/c6c4180a-80e7-f591-afdc-85cbfca98563.jpeg) をクリックするか、 `Ctrl+Shift+M` で失敗箇所の一覧が表示される。
    - ![スクリーンショット_123015_054651_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/2e207ef3-c087-88d6-79a1-49ca7ad0d440.jpeg)
- 項目を選択すると、当該ファイルの失敗行にジャンプする。
- 失敗行は赤線が表示され、スクロールバーの該当位置に赤い四角が表示される。
    - ![スクリーンショット_123015_054519_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/20faf624-4fd8-536f-664a-598eb810b483.jpeg)
    - 赤線行にマウスオーバーすると、エラー内容がポップアップ表示される。
- 修正して再度テストを実行すると、アンダーラインが消える。
    - ![スクリーンショット_123015_055206_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16375/4577a3a8-488f-e92e-637f-a7d748e125bf.jpeg)
- Enjoy!

# テストを全件実行したい

```:.vscode/tasks.json
// （省略）
      "args": [
        "test",
        "${file}"
      ],
// （省略）
```

ここを

```:.vscode/tasks.json
// （省略）
      "args": [
        "test"
      ],
// （省略）
```

に変更。

# Output出したくない

```:.vscode/tasks.json
// （省略）
  "showOutput": "always",
// （省略）
```

ここを

```:.vscode/tasks.json
// （省略）
  "showOutput": "silent",
// （省略）
```

に変更。

# 書いていないこと

- Visual Studio Codeの詳しい設定方法
    - Task
        - ビルドやテストの実行操作を定義したもの
        - https://code.visualstudio.com/docs/editor/tasks
        - https://code.visualstudio.com/docs/editor/tasks_appendix
    - Problem Matcher
        - 標準出力を正規表現でパースすることで、警告やエラーなどを検知して通知する仕組み
        - https://code.visualstudio.com/Docs/editor/tasks#_defining-a-problem-matcher