Tune in to Trailblazers Innovate for Salesforce product news,
demos, and latest roadmaps. Register here.
close
進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

Apex トリガのテスト

学習の目的

この単元を完了すると、次のことができるようになります。
  • 単一レコード操作を起動するトリガのテストを記述する。
  • クラスのすべてのテストメソッドを実行する。

Apex トリガのテスト

トリガをリリースする前に、トリガを起動するアクションを実行し、予想どおりの結果であることを確認する単体テストを記述します。

「Apex トリガの記述」単元で取り上げたトリガをテストしましょう。取引先レコードに商談が関連付けられている場合、AccountDeletion トリガはレコードが削除されるのを防ぎます。

前提条件

  1. まだ AccountDeletion トリガを追加していない場合は、次の手順に従います。
    1. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Trigger (Apex トリガ)] をクリックします。
    2. トリガ名に「AccountDeletion」と入力して、sObject に [Account (取引先)] を選択します。[Submit (登録)] をクリックします。
    3. デフォルトのコードを次のコードに置き換えます。
      trigger AccountDeletion on Account (before delete) {
         
          // Prevent the deletion of accounts if they have related opportunities.
          for (Account a : [SELECT Id FROM Account
                           WHERE Id IN (SELECT AccountId FROM Opportunity) AND
                           Id IN :Trigger.old]) {
              Trigger.oldMap.get(a.Id).addError(
                  'Cannot delete account with related opportunities.');
          }
          
      }
  2. 前の単元で AccountDeletion トリガを追加し、システムで問題をチェックできるように無効化してある場合は、再び有効にします。
    1. [設定] から 「Apex トリガ」を検索します。
    2. [Apex トリガ] ページで、AccountDeletion トリガの横にある [編集] をクリックします。
    3. [有効] を選択します。
    4. [保存] をクリックします。
  3. 前の単元で取り上げた AddRelatedRecordCalloutTrigger、または HelloWorldTrigger というトリガが組織にある場合は、無効にします。たとえば、AddRelatedRecord トリガを無効にする手順は、次のとおりです。
    1. [設定] から 「Apex トリガ」を検索します。
    2. [Apex トリガ] ページで、AddRelatedRecord トリガの横にある [編集] をクリックします。
    3. [有効] をオフにします。
    4. [保存] をクリックします。
  4. HelloWorldTrigger および CalloutTrigger トリガを無効にするには、上記の手順を繰り返します。

単体テストの追加および実行

最初に、テストメソッドを追加してみましょう。このテストメソッドでは、トリガが設計された目的 (ポジティブケース) を検証します。つまり、取引先に商談が関連付けられている場合はその取引先が削除されないようにします。

  1. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
  2. クラス名として「TestAccountDeletion」と入力し、[OK] をクリックします。
  3. デフォルトのクラス本文を次のコードで置き換えます。
    @isTest
    private class TestAccountDeletion {
    
        @isTest static void TestDeleteAccountWithOneOpportunity() {
            // Test data setup
            // Create an account with an opportunity, and then try to delete it
            Account acct = new Account(Name='Test Account');
            insert acct;
            Opportunity opp = new Opportunity(Name=acct.Name + ' Opportunity',
                                           StageName='Prospecting',
                                           CloseDate=System.today().addMonths(1),
                                           AccountId=acct.Id);
            insert opp;
            
            // Perform test
            Test.startTest();
            Database.DeleteResult result = Database.delete(acct, false);
            Test.stopTest();
    
            // Verify 
            // In this case the deletion should have been stopped by the trigger,
            // so verify that we got back an error.
            System.assert(!result.isSuccess());
            System.assert(result.getErrors().size() > 0);
            System.assertEquals('Cannot delete account with related opportunities.',
                                 result.getErrors()[0].getMessage());
        }
        
    }

    このテストメソッドでは最初に、商談のあるテスト取引先を設定します。次に、このテスト取引先を削除すると、この操作によって AccountDeletion トリガが実行されます。テストメソッドで、Database.delete() コールの戻り値をチェックして、トリガによってテスト取引先の削除が防止されたことを確認します。戻り値の Database.DeleteResult オブジェクトには、削除操作に関する情報が含まれます。テストメソッドで、削除が行われなかったことと、エラーメッセージが取得されたことを確認します。

  1. このテストを実行するには、[Test (テスト)] | [New Run (新規実行)] をクリックします。
  2. [Test Classes (テストクラス)] の下で、[TestAccountDeletion] をクリックします。
  3. TestAccountDeletion クラスのすべてのメソッドをテスト実行に追加するには、[Add Selected (選択項目を追加)] をクリックします。
  4. [Run (実行)] をクリックします。

    [Tests (テスト)] タブの最新の実行で、テスト結果を見つけます。

TestAccountDeletion テストクラスには、1 つの取引先レコードをテストする 1 つのテストメソッドのみが含まれます。また、このテストはポジティブケースが対象です。商談のない取引先の削除や取引先の一括削除など、必ず他のシナリオもテストして、すべてのケースでトリガが機能することを確認します。

テストデータはテストメソッド内部に設定されるため、さらにテストメソッドを追加していくと、設定に時間がかかる場合があります。多くのテストメソッドがある場合は、テストデータの作成をテストユーティリティクラスに入れて、複数のテストメソッドからそのユーティリティクラスをコールします。次の単元では、テストユーティリティクラスを利用して、さらにいくつかのテストメソッドを追加する方法ついて説明します。

もうひとこと...

テストメソッドには、Test.startTest() および Test.stopTest() メソッドのペアが含まれます。このペアによって、ガバナ制限の最新セットを取得するコードのブロックが区切られます。このテストでは、テストを実行する前に、テストデータの設定に 2 つの DML ステートメントが使用されます。その Apex コードがガバナ制限内で実行されることをテストするには、データ設定の使用制限をテストの使用制限と切り離す必要があります。データ設定プロセスの使用制限を切り離すには、テストコールを Test.startTest()Test.stopTest() のブロックで囲みます。このテストブロックは、非同期 Apex をテストする場合にも使用します。詳細は、「Limits、startTest、および stopTest の使用」を参照してください。

メモ

メモ

開発者コンソールの既知の問題により、テストのサブセットを実行した場合はコードカバー率が正しく更新されません。コードカバー率の結果を更新するには、[Test (テスト)] | [New Run (新規実行)] ではなく、[Test (テスト)] | [Run All (すべて実行)] を使用します。

リソース

ドキュメント

Apex 開発者ガイド』 の次のセクションを参照してください。