この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

単体テストメソッドの実行

Apex コードの機能性を検証するには、単体テストを実行します。Apex テストメソッドは、開発者コンソール、[設定]、Visual Studio Code 向け Salesforce 拡張機能で実行するか、API を使用して実行できます。
次のグルーピングによる単体テストを実行できます。
  • 特定のクラスの一部または全部のメソッド
  • クラスのセットの一部または全部のメソッド
  • 定義済みのクラスのスイート (「テストスイート」と呼ばれる)
  • 組織のすべての単体テスト

テストを実行するには、次のいずれかを使用します。

Salesforce ユーザーインターフェース (開発者コンソールなど) から開始するすべての Apex テストを非同期で並列実行します。Apex テストクラスは、実行のための Apex ジョブキューに置かれます。24 時間あたりに実行できるテストクラスの最大数は、500 または組織のテストクラス数 × 10 の大きい方です。Sandbox 組織および Developer Edition 組織ではこの制限が緩和されており、500 または (20 x 組織のテストクラス数) の大きい方です。

リリースの一環として実行される Apex テストは、常に順序に従って同期実行されます。

メモ

Salesforce ユーザーインターフェースによるテストの実行

Apex テスト実行ページで単体テストを実行できます。このページで開始したテストは非同期的に実行するため、テストクラスの実行が完了するのを待つ必要はありません。Apex テスト実行ページは、テストが完了すると、テストの状況を更新して結果を表示します。
Apex テスト実行ページ
  1. [設定] から、[クイック検索] ボックスに「Apex テスト実行」と入力し、[Apex テスト実行] を選択します。
  2. [テストを選択...] をクリックします。

    管理パッケージからインストールされた Apex クラスがある場合、最初に [Apex クラス] ページの [すべてのクラスをコンパイル] をクリックしてこれらのクラスをコンパイルして、リストに表示されるようにする必要があります。

    メモ

  3. 実行するテストを選択します。テストのリストには、テストメソッドが含まれるクラスのみが表示されます。
    • インストール済み管理パッケージからテストを選択するには、管理パッケージの対応する名前空間をドロップダウンリストから選択します。リストには、選択した名前空間の管理パッケージのクラスのみ表示されます。
    • 組織にローカルに存在するテストを選択するには、ドロップダウンリストから [私の名前空間] を選択します。管理パッケージからインストールされたクラスを除くローカルクラスのみリストに表示されます。
    • テストを選択するには、ドロップダウンリストから [すべての名前空間] を選択します。管理パッケージからインストールされたかどうかに関わらず、組織内のすべてのクラスが表示されます。

    テストが現在実行中のクラスは、リストに表示されません。

    メモ

  4. テスト実行時のコードカバー率情報の収集を除外するには、[コードカバー率をスキップ] を選択します。
  5. [実行] をクリックします。

Apex テスト実行ページを使用してテストを実行した後、開発者コンソールでコードカバー率の詳細を確認できます。

[設定] から、[クイック検索] ボックスに「Apex」と入力し、[Apex テスト実行] を選択して、[テスト履歴を表示] をクリックし、自分で実行したテストだけでなく、組織のすべてのテスト結果を表示します。テスト結果は、クリアされない限り実行終了後 30 日間残ります。

Visual Studio Code 向け Salesforce 拡張機能を使用したテストの実行

Visual Studio Code を使用してテストを実行できます。「Visual Studio Code 向け Salesforce 拡張機能」を参照してください。

Lightning プラットフォーム開発者コンソールを使用したテストの実行

開発者コンソールでは、特定のテストクラスの一部またはすべてのテストを実行したり、テストスイートを設定および実行したり、すべてのテストを実行したりできます。開発者コンソールでは、テストはバックグラウンドで非同期に実行されます。ただし、テスト実行に含まれるクラスが 1 つだけで、[Tests (テスト)] メニューで [Always Run Asynchronously (常に非同期に実行)] を選択していない場合を除きます。テストを非同期に実行することにより、テスト実行中に開発者コンソールの他の領域で作業することができます。テスト実行が完了したら、開発者コンソールでテスト結果を確認することができます。また、テストでカバーされたクラスのコードカバー率全体を確認することができます。

詳細は、Salesforce ヘルプの「開発者コンソール」を参照してください。

API を使用したテストの実行

runTests() コールを SOAP API から使用して、テストを同期して実行できます。
1RunTestsResult[] runTests(RunTestsRequest ri)
このコールでは、すべてのクラスのすべてのテスト、特定の名前空間のすべてのテスト、または特定の名前空間のクラスのサブセットにあるすべてのテストを、RunTestsRequest オブジェクトに指定されているとおりに実行できます。次の値が返されます。
  • 実行されたテストの合計数
  • コードカバー率の統計
  • 失敗したテストごとのエラー情報
  • 成功したテストごとの情報
  • テストの実行に要した時間

runTests() の詳細は、『SOAP API 開発者ガイド』「runTests()」を参照してください。

Tooling REST API を使用してテストを実行することもできます。/runTestsAsynchronous/ および /runTestsSynchronous/ エンドポイントを使用して、テストを非同期にまたは同期して実行します。使用方法の詳細は、Tooling API: REST リソース」を参照してください。

ApexTestQueueItem を使用したテストの実行

テストは ApexTestQueueItemApexTestResult を使用して非同期で実行できます。これらのオブジェクトでは、テストを Apex ジョブキューに追加し、完了したテストの実行結果を確認できます。このプロセスにより、テストを非同期で開始するだけではなく、Apex スケジューラーを使用して特定の時刻にテストを実行するようにスケジュールすることもできます。詳細は、「Apex スケジューラー」を参照してください。

ApexTestQueueItem オブジェクトを挿入して、対応する Apex クラスを実行待ち Apex ジョブキューに配置します。Apex ジョブはクラスのテストメソッドを実行します。ジョブを実行すると、テストの一環として単一のテストメソッドが実行されるたびに、その結果が ApexTestResult に含まれます。

Apex ジョブキュー内にあるクラスを中止するには、ApexTestQueueItem オブジェクトに更新操作を実行し、Status 項目を Aborted に設定します。

1 つの一括処理に複数の Apex テストキュー項目を挿入した場合、キュー項目の親ジョブは同じになります。つまり、すべてのテストキュー項目が同じ一括処理に挿入されていれば、テスト実行を複数のクラスのテストの実行で構成できます。

Apex ジョブキューに挿入できるテストキュー項目およびクラスの最大数は、500 または組織のテストクラス数 × 10 の大きい方です。Sandbox 組織および Developer Edition 組織ではこの制限が緩和されており、500 または (20 x 組織のテストクラス数) の大きい方です。

次の例では、DML 演算子を使用して ApexTestQueueItem および ApexTestResult オブジェクトを挿入および照会します。enqueueTests メソッドは、末尾が Test のすべてのクラスにキュー項目を挿入します。次に、1 つのキュー項目の親ジョブ ID を返します。キュー項目は一括で挿入されたため、すべてのキュー項目の親ジョブ ID は同じです。checkClassStatus メソッドは、指定されたジョブ ID に対応するすべてのキュー項目を取得します。次に、各クラスの名前、ジョブの状況、および合格率を照会して出力します。checkMethodStatus メソッドは、ジョブの一環として実行された各テストメソッドの情報を取得します。
1public class TestUtil {
2
3    // Enqueue all classes ending in "Test". 
4    public static ID enqueueTests() {
5        ApexClass[] testClasses = 
6           [SELECT Id FROM ApexClass 
7            WHERE Name LIKE '%Test'];
8        if (testClasses.size() > 0) {
9            ApexTestQueueItem[] queueItems = new List<ApexTestQueueItem>();
10            for (ApexClass cls : testClasses) {
11                queueItems.add(new ApexTestQueueItem(ApexClassId=cls.Id));
12            }
13
14            insert queueItems;
15
16            // Get the job ID of the first queue item returned.
17            ApexTestQueueItem item = 
18               [SELECT ParentJobId FROM ApexTestQueueItem 
19                WHERE Id=:queueItems[0].Id LIMIT 1];
20            return item.parentjobid;
21        }
22        return null;
23    }
24
25    // Get the status and pass rate for each class
26    // whose tests were run by the job.
27    // that correspond to the specified job ID.
28    public static void checkClassStatus(ID jobId) {
29        ApexTestQueueItem[] items = 
30           [SELECT ApexClass.Name, Status, ExtendedStatus 
31            FROM ApexTestQueueItem 
32            WHERE ParentJobId=:jobId];
33        for (ApexTestQueueItem item : items) {
34            String extStatus = item.extendedstatus == null ? '' : item.extendedStatus;
35            System.debug(item.ApexClass.Name + ': ' + item.Status + extStatus);
36        }
37    }
38
39    // Get the result for each test method that was executed.
40    public static void checkMethodStatus(ID jobId) {
41        ApexTestResult[] results = 
42           [SELECT Outcome, ApexClass.Name, MethodName, Message, StackTrace 
43            FROM ApexTestResult 
44            WHERE AsyncApexJobId=:jobId];
45        for (ApexTestResult atr : results) {
46            System.debug(atr.ApexClass.Name + '.' + atr.MethodName + ': ' + atr.Outcome);
47            if (atr.message != null) {
48                System.debug(atr.Message + '\n at ' + atr.StackTrace);
49            }
50        }
51    }
52}