単体テストメソッドの実行
- 特定のクラスの一部または全部のメソッド
- クラスのセットの一部または全部のメソッド
- 定義済みのクラスのスイート (「テストスイート」と呼ばれる)
- 組織のすべての単体テスト
テストを実行するには、次のいずれかを使用します。
Salesforce ユーザーインターフェース (開発者コンソールなど) から開始するすべての Apex テストを非同期で並列実行します。Apex テストクラスは、実行のための Apex ジョブキューに置かれます。24 時間あたりに実行できるテストクラスの最大数は、500 または組織のテストクラス数 × 10 の大きい方です。Sandbox 組織および Developer Edition 組織ではこの制限が緩和されており、500 または (20 x 組織のテストクラス数) の大きい方です。
Salesforce ユーザーインターフェースによるテストの実行

- [設定] から、[クイック検索] ボックスに「Apex テスト実行」と入力し、[Apex テスト実行] を選択します。
- [テストを選択...] をクリックします。
- 実行するテストを選択します。テストのリストには、テストメソッドが含まれるクラスのみが表示されます。
- インストール済み管理パッケージからテストを選択するには、管理パッケージの対応する名前空間をドロップダウンリストから選択します。リストには、選択した名前空間の管理パッケージのクラスのみ表示されます。
- 組織にローカルに存在するテストを選択するには、ドロップダウンリストから [私の名前空間] を選択します。管理パッケージからインストールされたクラスを除くローカルクラスのみリストに表示されます。
- テストを選択するには、ドロップダウンリストから [すべての名前空間] を選択します。管理パッケージからインストールされたかどうかに関わらず、組織内のすべてのクラスが表示されます。
- テスト実行時のコードカバー率情報の収集を除外するには、[コードカバー率をスキップ] を選択します。
- [実行] をクリックします。
Apex テスト実行ページを使用してテストを実行した後、開発者コンソールでコードカバー率の詳細を確認できます。
[設定] から、[クイック検索] ボックスに「Apex」と入力し、[Apex テスト実行] を選択して、[テスト履歴を表示] をクリックし、自分で実行したテストだけでなく、組織のすべてのテスト結果を表示します。テスト結果は、クリアされない限り実行終了後 30 日間残ります。
Visual Studio Code 向け Salesforce 拡張機能を使用したテストの実行
Visual Studio Code を使用してテストを実行できます。「Visual Studio Code 向け Salesforce 拡張機能」を参照してください。
Lightning プラットフォーム開発者コンソールを使用したテストの実行
開発者コンソールでは、特定のテストクラスの一部またはすべてのテストを実行したり、テストスイートを設定および実行したり、すべてのテストを実行したりできます。開発者コンソールでは、テストはバックグラウンドで非同期に実行されます。ただし、テスト実行に含まれるクラスが 1 つだけで、[Tests (テスト)] メニューで [Always Run Asynchronously (常に非同期に実行)] を選択していない場合を除きます。テストを非同期に実行することにより、テスト実行中に開発者コンソールの他の領域で作業することができます。テスト実行が完了したら、開発者コンソールでテスト結果を確認することができます。また、テストでカバーされたクラスのコードカバー率全体を確認することができます。
詳細は、Salesforce ヘルプの「開発者コンソール」を参照してください。
API を使用したテストの実行
1RunTestsResult[] runTests(RunTestsRequest ri)- 実行されたテストの合計数
- コードカバー率の統計
- 失敗したテストごとのエラー情報
- 成功したテストごとの情報
- テストの実行に要した時間
runTests() の詳細は、『SOAP API 開発者ガイド』の「runTests()」を参照してください。
Tooling REST API を使用してテストを実行することもできます。/runTestsAsynchronous/ および /runTestsSynchronous/ エンドポイントを使用して、テストを非同期にまたは同期して実行します。使用方法の詳細は、「Tooling API: REST リソース」を参照してください。
ApexTestQueueItem を使用したテストの実行
テストは ApexTestQueueItem と ApexTestResult を使用して非同期で実行できます。これらのオブジェクトでは、テストを Apex ジョブキューに追加し、完了したテストの実行結果を確認できます。このプロセスにより、テストを非同期で開始するだけではなく、Apex スケジューラーを使用して特定の時刻にテストを実行するようにスケジュールすることもできます。詳細は、「Apex スケジューラー」を参照してください。
ApexTestQueueItem オブジェクトを挿入して、対応する Apex クラスを実行待ち Apex ジョブキューに配置します。Apex ジョブはクラスのテストメソッドを実行します。ジョブを実行すると、テストの一環として単一のテストメソッドが実行されるたびに、その結果が ApexTestResult に含まれます。
Apex ジョブキュー内にあるクラスを中止するには、ApexTestQueueItem オブジェクトに更新操作を実行し、Status 項目を Aborted に設定します。
1 つの一括処理に複数の Apex テストキュー項目を挿入した場合、キュー項目の親ジョブは同じになります。つまり、すべてのテストキュー項目が同じ一括処理に挿入されていれば、テスト実行を複数のクラスのテストの実行で構成できます。
Apex ジョブキューに挿入できるテストキュー項目およびクラスの最大数は、500 または組織のテストクラス数 × 10 の大きい方です。Sandbox 組織および Developer Edition 組織ではこの制限が緩和されており、500 または (20 x 組織のテストクラス数) の大きい方です。
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}