見出し画像

Salesforce開発での単体テストについて

SalesforceでApexを使って開発する場合に気を付けなければならない事があります。

開発したApexクラスの単体テストをコードで書いておく必要があると言うことです。

テストコードを書いておかないと本番組織にリリースできません。本番組織にリリースするためには以下の制約があります。

・開発したApexクラスのテストカバレッジが75%以上
・Apexトリガについては、必ずテストコードが必要

最近、久しぶりにApexクラスのテストコードを書く機会があり、改めて調べて見ました。すると新たな発見があったのでご紹介します。

テスト対象となるApexクラス

テスト対象となるApexクラスは、取引先情報を取得するだけの簡単なものです。

public with sharing class AccountList {
   public AccountList() {

   }

   static public List<Account> getAll() {
       return [select Id,Name,BillingState from Account limit 1];
   }
}

テストデータの準備

Apexクラスをテストするときにデータが必要になります。たいていの場合、意図したデータが必要になります。

データの作成をコードで書くこともできますが、静的リソースを使ってロードすることもできます。

以下のような取引先を登録するためのCSVファイルを準備します。UTF-8で作成する必要がありますので、注意が必要です(UTF-8でもBOM付きだとエラーになります)

Name,BillingState
取引先A,北海道
取引先B,青森県
取引先C,岩手県
取引先D,秋田県
取引先E,宮城県
取引先F,山形県
取引先G,福島県

準備したCSVファイルを静的リソースに登録します。

画像1

単体テストコードを準備

単体テスト用のApexクラスの作成

単体テスト用のApexクラスを作成します。名称は自由ですが、私はテスト対象のApexクラス名_Testとするようにしています。

単体テスト用のApexクラスには、@isTestアノテーションを付けます。あとは、public with sharingをprivateに変更します。

@isTest
private class AccountList_Test {
   public AccountList_Test() {

   }
}

単体テスト実行時に最初に実行されるメソッド

単体テストコードを実行するときに、まず実行されるメソッドがあります。@TestSetupアノテーションが付いたメソッドです。

単体テストで利用するデータはここで準備しましょう。

Test.loadDataを使って静的リソースAccountsからデータをロードします。ロードしたデータはデータベースにも登録されている状態です。

    @TestSetup
   static void setup(){
       // テスト用の取引先データを登録する
       List<Account> lstAccount = Test.loadData(Account.sObjectType, 'Accounts');
   }

単体テストコードを準備

単体テストコードを書きます。単体テストのメソッドには、@isTestアノテーションを付けます。さらにstaticである必要があります。

    @isTest
   static void test_getAll() {
       // AccluntList.getAllをテストする
       List<Account> lstAccount = AccountList.getAll();

       // データが取得できているかを確認する
       System.assert(lstAccount.size() != 0); 
   }

単体テストを実行

VisualStudio Codeからテストを実行する場合は、.vscode/settings.jsonに、"salesforcedx-vscode-core.retrieve-test-code-coverage":trueを追加しておきましょう。これでテスト結果にカバレッジが表示されます。

テストを実行すると以下のように結果が表示されます。全てのテストが成功し、カバレッジが75%以上になっている事を確認しておきましょう。

Test Run Coverageの75%以上は必須、Org Wide Coverageが75%を切っている時はプロジェクト全体で気を付けておく必要があります。

=== Test Summary
NAME                 VALUE
───────────────────  ───────────────────────────────────────────────────────────────────
Outcome              Passed
Tests Ran            1
Passing              1
Failing              0
Skipped              0
Pass Rate            100%
Fail Rate            0%
Test Start Time      Sep 11, 2019 9:31 AM
Test Execution Time  37 ms
Test Total Time      37 ms
Command Time         4904 ms
Hostname             https://xxxx
Org Id               xxxxx
Username             xxx
Test Run Id          7076D0000055Ccr
User Id              0056D000000zIvyQAE
Test Run Coverage    100%
Org Wide Coverage    50%

単体テストをコードで書くことの大切さはいろいろと紹介されていますが、実現するとなると大変ですよね。

Salesforceの場合、本番組織にリリースする条件になっていますので、地道に作っておかなければなりません。

そうしないと、リリース直前になって、大変な事になりますので、気を付けてください。


この記事が気に入ったらサポートをしてみませんか?