【Apex】テストクラスの基本:最小構成で分かりやすく解説

  • URLをコピーしました!

Apexのテストクラスは、Salesforce上で開発したApexコード(トリガやクラスなど)が正しく動作するかを検証するためのコードです。

Salesforceでは、本番環境へApexコードをデプロイする際に、テストクラスのコードカバレッジが75%以上であることが必須条件とされており、テストクラスは開発において欠かせない存在となっています。
(※コードカバレッジとは、ソースコードがテストによってどの程度実行されたかの網羅率のこと)

さらに、テストを通じて、バグの早期発見やロジックの妥当性検証が可能になります。
特に条件分岐や例外処理を含む複雑な処理の品質を担保するうえで非常に効果的です。

本記事では、Apex初心者の方にもわかりやすく、テストクラスの基本的な考え方から記述方法までを丁寧に解説していきます。

目次

最小構成で覚えるテストクラスの型

最小限の構文

コードはこちら
@isTest(SeeAllData=false)
private class SampleTestClass {

    @isTest
    static void testMainLogic() {
        // データ準備
        Account acc = new Account(Name = 'Test Co.');
        insert acc;
        // テスト対象メソッドを実行(CustomFlag__c を trueに更新)
        sampleLogic.doSomething(acc.Id);
    }

    // 結果を検証
    Account result = [SELECT CustomFlag__c FROM Account WHERE Id = :acc.Id];
    System.assertEquals(true, result.CustomFlag__c);
}

@isTest

テストクラス or メソッドであることを明示しています。
テストクラスの場合は、必ず記述が必要となります。

SeeAllData

  • SeeAllData=false:テストの実行時に本番データ(既存の組織データ)を使用しない
  • SeeAllData=true:テストの実行時に本番データ(既存の組織データ)を使用する

・基本的には、SeeAllData=false を推奨(実際のデータに影響なしのため)
・SeeAllData を省略し、@isTest のみ記述した場合は、自動的に SeeAllData=false となる

private class

テストクラスは基本的に privateスコープ で宣言されます。
(テストは外部から呼び出されることを前提としないため。)

static method

Apexのテストメソッドは static(静的)メソッドとして宣言する必要があります。

Account acc = new Account(Name = ‘Test Co.’);
insert acc;

Apexテストでは自前でデータを用意する必要があります。
(上記のSeeAllData に関連)

sampleLogic.doSomething()

実行対象のメソッド(カバレッジの本体)を指します。

sampleLogic:対象のApexクラス
doSomething():実行するメソッド

System.assertEquals()

System.assertは、プログラムが実行する動作の検証によく使用されており、上記では2つの引数が一致することを確認しています。
結果が一致しない場合は、エラーを返してコードの実行を停止します。

テストクラス および 対応するApexクラスの例

Apexクラス

AccountのListを受け取り、業種(Industry)を条件にフラグ(CustomFlag__c)を更新

コードはこちら
public class AccountLogic {
    public static String updateFlagByIndustry(List<Account> accList) {
        if (accList != null && !accList.isEmpty()) {
            for (Account acc : accList) {
                if (acc.Industry == 'Technology' || acc.Industry == 'Finance') {
                    acc.CustomFlag__c = true;
                } else {
                    acc.CustomFlag__c = false;
                }
            }
            update accList;
        } else {
            return '処理対象が存在しませんでした。';
        }
        return '更新処理が完了しました。';
    }
}

テストクラス

コードはこちら
@isTest
private class AccountLogicTest {
    @isTest
    static void testUpdateFlagByIndustry() {
    	// データ準備
        List<Account> testAccList = new List<Account>();
        Account acc1 = new Account(Name = 'Tech Co', Industry = 'Technology');
        testAccList.add(acc1);
        Account acc2 = new Account(Name = 'Fin Co', Industry = 'Finance');
        testAccList.add(acc2);
        insert testAccList;

        // ロジック実行
        List<Account> accList = [SELECT Id, Name, Industry, CustomFlag__c FROM Account];
        String result = AccountLogic.updateFlagByIndustry(accList);

        // 検証
        System.debug('result: '+ result);
        Account techAcc = [SELECT CustomFlag__c FROM Account WHERE Name = 'Tech Co' LIMIT 1];
        Account finAcc = [SELECT CustomFlag__c FROM Account WHERE Name = 'Fin Co' LIMIT 1];
        System.debug('techAcc.CustomFlag__c: '+ techAcc.CustomFlag__c);
		System.debug('finAcc.CustomFlag__c: '+ finAcc.CustomFlag__c);
    }
}

次は実際にテストクラスを実行して、コードカバレッジを確認していきましょう。

テストクラスの実行確認

テストクラスの実行方法

STEP
開発者コンソールメニューの「Test」から、「New Run」を選択します。
画像に alt 属性が指定されていません。ファイル名: image-66.png
STEP
開いたウィンドウの左下の入力欄で実行するテストクラス名を指定します。
STEP
表示されたテストクラス名を選択すると、右にメソッドが表示されるため、実行するメソッドを選択します。
(今回は1つのみですが、複数メソッドが存在する場合は個別 or まとめて実行可能)
STEP
右下の「Run」をクリックして、テストクラスを実行します。

カバレッジの確認

テストクラスを実行すると、開発者コンソール下の「Test」タブに実行結果が表示されます。
一番左のStatus列が の場合は、テストクラス実行がエラー無く完了されています。

右には対象のApexクラス名が表示されており、ここでカバレッジ(%)の確認が可能です。
また、上記Apexクラス名をダブルクリックすると、以下通りコードのカバー箇所についても確認することが可能です。

青色の箇所がコードカバー済みであること、赤色の箇所はコード未カバーであることを示しています。

テストクラス内に以下の確認用のログを仕込んでいましたので、こちらも合わせて確認しておきましょう。

ログの確認

開発者コンソール下の「Logs」タブからテストクラス実行のログを探します。
(Operationにて、「Test」が含まれているログ)
ダブルクリックするとログが一覧で表示されます。

「Logs」タブ上部のチェックボックスで、「Debug Only」をチェックすると、デバッグログのみ表示可能です。

上記より、想定通りのログが出力されていることを確認できました。

カバレッジを向上させるコツ

カバレッジ向上のコツ

if-elseなどの分岐を全て通るようにデータを用意
nullや空配列を考慮した分岐も実行
不正な値で例外を起こさせるテストも必要

今回の実行結果である以下のカバレッジでは、if-elseの分岐やnullや空配列の考慮について、未カバー箇所が発生しています。

<未カバー箇所>
・フラグ(CustomFlag__c)がtrue とならない業種(Industry)の分岐処理
・処理対象が無い場合の処理

上記の未カバー箇所に対応するテストデータを追加することで、カバレッジ向上を目指すことができます。

テストクラスの修正例 および 修正後再実行

例)①フラグ(CustomFlag__c)がtrueとならない業種(Industry)データを追加
  ②処理対象が無い場合の実行パターンを追加

コメント:【テストクラス修正】~ の箇所を追加

コードこちら
@isTest
private class AccountLogicTest {
    @isTest
    static void testUpdateFlagByIndustry() {

        // データ準備
        List<Account> testAccList = new List<Account>();
        Account acc1 = new Account(Name = 'Tech Co', Industry = 'Technology');
        testAccList.add(acc1);
        Account acc2 = new Account(Name = 'Fin Co', Industry = 'Finance');
        testAccList.add(acc2);
        // 【テストクラス修正】①更新対象外の業種データ追加
        Account acc3 = new Account(Name = 'Ene Co', Industry = 'Energy');
        testAccList.add(acc3);
        insert testAccList;

        // ロジック実行
        List<Account> accList = [SELECT Id, Name, Industry, CustomFlag__c FROM Account];
        String result = AccountLogic.updateFlagByIndustry(accList);

        // 検証
        System.debug('result: '+ result);
        Account techAcc = [SELECT CustomFlag__c FROM Account WHERE Name = 'Tech Co' LIMIT 1];
        Account finAcc = [SELECT CustomFlag__c FROM Account WHERE Name = 'Fin Co' LIMIT 1];
        System.debug('techAcc.CustomFlag__c: '+ techAcc.CustomFlag__c);
        System.debug('finAcc.CustomFlag__c: '+ finAcc.CustomFlag__c);

        // 【テストクラス修正②】更新対象なしでの実行確認追加
        List<Account> accList2 = new List<Account>();
        String result2 = AccountLogic.updateFlagByIndustry(accList2);
    }
}

テストクラスを再実行

テストクラスを修正することで、カバレッジ100%を達成することができました。

まとめ

Apexにおけるテストクラスは、単に本番環境へのデプロイ条件を満たすためだけの存在ではなく、コードの品質を高め、将来的な保守性や安定性を確保するための重要な仕組みです。

本記事では、テストクラスの基本構文から実行方法、コードカバレッジの確認、そして100%を目指すための改善ポイントまでを順を追って解説しました。

始めのうちは少し難しく感じるかもしれませんが、基本の構文や流れを一度理解してしまえば、効率的に書けるようになります。
とくに初心者の方にとっては、最初の一歩として「最低限通る構成でまずは書いてみること」が大切です。
そこから徐々に分岐処理や異常系パターンへの対応を追加していくことで、より信頼性の高いコードを目指すことができます。

テストクラスを正しく書き、活用できるようになることは、Apex開発者としての大きなステップです。
この記事がその第一歩として、皆さんの理解と実践の助けになれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次