Visual Studio Code で Salesforce の Apex テストを実行・デバッグする

Salesforce 公式の Visual Studio Code (VS Code) 拡張機能である[Salesforce Extensions for VS Code](https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode)は、Salesforce CLI のコマンド群を実行できるコア機能に加えて、Apex テストについても豊富な機能を提供しています。この記事では、公式の VS Code 拡張機能を用いた基本的な Apex テストの実行・確認方法やApex Replay Debugger を用いたデバッグログの分析方法を紹介します。

## 準備
開発環境の設定方法は、以下の記事をご確認ください。
[Visual Studio Code で Salesforce の開発環境を構築する](https://qiita.com/shunkosa/items/e6248520bff90f397158)

## Apexテストの実行
VS Code で Apex テストを実行するには以下の方法があります。
### 開いているファイルから実行
@isTest アノテーションが付与された Apex クラスまたはメソッドにはそれぞれ``Run All Tests``、``Run Test``のリンクが表示されます。これらをクリックするとテストが実行できます。
<img width="511" alt="スクリーンショット 2018-10-15 23.20.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/184624/2ad129e5-fcbd-0519-3fa6-cbf7d3f81e00.png">

### サイドバーから実行
ビーカーのアイコン<img width="20" alt="スクリーンショット 2018-10-20 0.06.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/184624/b02992e5-972c-b521-dcf3-1ada500151a6.png">からApexテスト用のサイドバーを表示します。再生ボタン:arrow_forward:をクリックしてテストを実行できます。
<img width="318" alt="スクリーンショット 2018-10-15 23.25.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/184624/4eb5ef3e-8da8-e0df-30f9-788bb154862d.png">

### コマンドパレットから実行
コマンドパレットを起動 (Ctrl+Shift+P/Cmd+Shift+P) し、``SFDX: Invoke Apex Tests...`` を実行後、実行したいテストクラスを選択することでもテストを実行できます。
<img width="609" alt="スクリーンショット 2018-10-15 23.30.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/184624/b73826a6-5fa2-27ab-447d-c75697149d3b.png">

## テスト結果の確認
実行した Apex テストの結果を確認するには以下の方法があります。
### サイドバーで結果を確認する
<img width="511" alt="スクリーンショット 2018-10-20 0.05.42のコピー.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/184624/93c9cbb8-5bf9-9b8e-5adc-34e80e54f5fc.jpeg">
Pass したテストは緑色、Fail したテストは赤色アイコンで表示されます。また、テストクラスにカーソルを合わせるとサマリが表示されます。
### コンソールの出力で結果を確認する
メッセージは出力タブから確認できます。
<img width="1119" alt="Apex test result in output panel" src="https://qiita-image-store.s3.amazonaws.com/0/184624/910ec894-97fd-0831-7d1e-378fe810b53a.png">


### テスト結果にカバレッジを追加する
[settings.json](https://qiita.com/12345/items/1c6e752ffcce0b995cdc) に ``"salesforcedx-vscode-core.retrieve-test-code-coverage":true`` を追加すると、出力タブからカバレッジを確認できます。

<img width="1111" alt="--codecoverage option" src="https://qiita-image-store.s3.amazonaws.com/0/184624/970efecc-3820-3cf4-5f72-9ed0b39ae46f.png">

直後にフッターの `Highlight Apex Code Coverage` ボタン<img width="20" alt="Highlight Apex Code Coverage button" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184624/1d0dc74f-406e-4740-d550-ba578fa2ac66.png">をクリックし対象の Apex クラスを開くとカバレッジを視覚的に確認できます。

<img width="831" alt="Apex Visual Code Coverage Example" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184624/a5663199-ff3f-78d7-733e-8130c89b7ecc.png">


## 匿名実行
+ 開いているファイルをそのまま匿名実行する場合は、コマンドパレットから``SFDX: Execute Anonymous Apex with Editor Contents``を実行します。
    + 補完が効きませんが、テキストファイルであれば拡張子は``.cls``である必要はありません。
+ 開いているファイルの一部を匿名実行する場合は、対象の文字列を選択している状態で、コマンドパレットを起動し``SFDX: Execute Anonymous Apex with Currently Selected Text``を実行します。

## デバッグログの確認
シンプルにログだけ取得するには、コマンドパレットから``SFDX : Get Apex Debug Logs...``を実行後(ログの一覧が表示されるまで少し時間がかかることがあります)、取得したいログを選択します。

## Apex Replay Debuggerでログを解析する
Apex Replay Debugger は、公式の拡張機能に含まれる、デバッグログの分析機能です。ビデオを録画して再生するように、トランザクションを記録し、ログに基づいてトランザクションをシミュレートします。一般的な対話型デバッガのように、ブレークポイントの設定やその時点での変数の状態を解析することができます。ちなみに名前が似ている[Apex Debugger](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_develop_apex_debugger.htm)は、スクラッチ組織やISVの顧客のSandboxをリアルタイムでデバッグするための機能です。
### 1. 事前設定
デバッグのサイドバーを開き、「構成の追加」→「Apex Replay Debugger」を選択します。``.vscode``フォルダに``launch.json``ファイルが作成されます。既に``launch.json``がある場合はReplay Debugger用の構成が追加されますので保存します。
<img width="312" alt="スクリーンショット 2018-10-20 14.02.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/184624/afa9ff1c-49e9-17e5-14f4-2e78a408bdc6.png">

### 2. ブレークポイント・チェックポイントの設定
ブレークポイントを設定するには、ApexクラスまたはApexトリガを開き、ブレークポイントを設定したい行番号の左隣をクリックします。
<img width="463" alt="スクリーンショット 2018-10-20 14.19.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/184624/903b6d3b-d8d2-c776-b592-ca863f6d32d6.png">
ブレークポイントよりも詳細な情報をデバッグ時に取得するには、チェックポイントを設定します。コードの行の実行時にヒープダンプが取得されるため、トリガーコンテキスト変数の値など、デバッグログに残らない情報を取得することができます。チェックポイントを設定するには、対象の行にカーソルを合わせた状態で、コマンドパレットから、``SFDX: Toggle Checkpoint``を実行します。チェックポイントを設定後、これを組織に反映させるため、コマンドパレットから``SFDX: Update Checkpoints in Org``を実行します。なお、一度に設定できるチェックポイントの数は最大で 5 つまでです。

### 3. ログレベルの設定・デバッグログの取得
Apex Replay Debugger を実行するためには、ログレベルの設定が、``APEX_CODE``は`FINEST`、`VISUALFORCE`は`FINER`または`FINEST`に設定されている必要があります。コマンドパレットから``SFDX: Turn On Apex Debug Log for Replay Debugger``を実行するか、手動でログレベルを変更しておきます。その後、何らかの方法でデバッグログを出力(例えば、画面を開く、レコードをバックグラウンドで更新する、Apex テストや匿名実行する、など)し、前述の``SFDX : Get Apex Debug Logs...``コマンドでログを取得します。
### 4. Apex Replay Debugger を起動する
デバッグログファイルを開き、エディタの任意の箇所で右クリックし(またはコマンドパレットから)`` SFDX: Launch Apex Replay Debugger with Current File``を選択します。
続行ボタン (F5) <img width="23" alt="Continue" src="https://qiita-image-store.s3.amazonaws.com/0/184624/0f9d1662-d56f-add0-961d-788747773326.png">をクリックする度に、設定したブレークポイント・チェックポイントにおける変数の値やコールスタックなどを左サイドバーで確認できます。
<img width="959" alt="Apex replay debugger example" src="https://qiita-image-store.s3.amazonaws.com/0/184624/faf0bdda-7af8-4040-63e1-6558437cf000.png">
デバッグについては [VS CodeのDocs](https://vscode-doc-jp.github.io/docs/userguide/debugging.html) も合わせて参考にしてください。
### 考慮事項
* ``SFDX: Turn On Apex Debug Log for Replay Debugger``で設定したログレベルや``SFDX: Update Checkpoints in Org``で設定したチェックポイントの有効期間は 30 分です。
* スケジュール Apex が生成するログは Replay できません。
* 1 度に 1 つのログしか Replay できないため、非同期 Apex のように複数のログを出力する場合は注意が必要です。
 
## 参考リンク
* [Apex Replay Debugger for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode-apex-replay-debugger)
* [Trailhead - Find and Fix Bugs with Apex Replay Debugger](https://trailhead.salesforce.com/ja/content/learn/projects/find-and-fix-bugs-with-apex-replay-debugger/)
* [Unit Testing on the Lightning Platform - Trailhead](https://trailhead.salesforce.com/ja/modules/unit-testing-on-the-lightning-platform) : テストコードの元ネタです。