Newer Version Available
テスト設定メソッドの使用
テスト設定メソッド (@testSetup アノテーションが付加されたメソッド) を使用して、テストレコードを 1 回作成し、テストクラスの各テストメソッドでそれらのレコードにアクセスできます。テスト設定メソッドを使用すると、すべてのテストメソッドに対する参照または前提データや、すべてのテストメソッドの操作対象となる共通のレコードセットを作成する必要がある場合に時間を節約できます。
テスト設定メソッドによりテスト実行時間を短縮できます。特に多くのレコードを処理する場合に効果があります。また、共通のテストデータを容易かつ効率的に作成できます。クラスに対して 1 回レコードを設定すれば、テストメソッドごとにレコードを再作成する必要はありません。また、テスト設定中に作成されたレコードのロールバックは、クラス全体の実行終了時に行われるため、ロールバックされるレコードの数も削減されます。その結果、テストメソッドごとにこうしたレコードを作成してロールバックする場合に比べ、システムリソースの使用効率が向上します。
テストクラスにテスト設定メソッドが含まれる場合、テストフレームワークは、テスト設定メソッドを最初に実行してから、そのクラスの他のテストメソッドを実行します。テスト設定メソッドで作成されたレコードは、テストクラス内のすべてのテストメソッドで使用でき、テストクラス実行終了時にロールバックされます。レコード項目の更新やレコード削除など、テストメソッドがこれらのレコードを変更した場合、その変更は、各テストメソッドの実行終了後にロールバックされます。次に実行されるテストメソッドは、元の変更されていない状態のレコードにアクセスできます。
構文
テスト設定メソッドは、テストクラスで定義され、引数を取らず、値を返しません。テスト設定メソッドの構文は次のとおりです。
1@testSetup static void methodName() {
2
3}例
次の例では、テストレコードを 1 回作成してから、複数のテストメソッドでそれらのレコードにアクセスする方法を示します。また、この例では、最初のテストメソッドで加えられた変更がロールバックされて 2 つ目のテストメソッドでは使用できないことも示します。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18private class CommonTestSetup {
19
20 @testSetup static void setup() {
21 // Create common test accounts
22 List<Account> testAccts = new List<Account>();
23 for(Integer i=0;i<2;i++) {
24 testAccts.add(new Account(Name = 'TestAcct'+i));
25 }
26 insert testAccts;
27 }
28
29 @isTest static void testMethod1() {
30 // Get the first test account by using a SOQL query
31 Account acct = [SELECT Id FROM Account WHERE Name='TestAcct0' LIMIT 1];
32 // Modify first account
33 acct.Phone = '555-1212';
34 // This update is local to this test method only.
35 update acct;
36
37 // Delete second account
38 Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
39 // This deletion is local to this test method only.
40 delete acct2;
41
42 // Perform some testing
43 }
44
45 @isTest static void testMethod2() {
46 // The changes made by testMethod1() are rolled back and
47 // are not visible to this test method.
48 // Get the first account by using a SOQL query
49 Account acct = [SELECT Phone FROM Account WHERE Name='TestAcct0' LIMIT 1];
50 // Verify that test account created by test setup method is unaltered.
51 System.assertEquals(null, acct.Phone);
52
53 // Get the second account by using a SOQL query
54 Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
55 // Verify test account created by test setup method is unaltered.
56 System.assertNotEquals(null, acct2);
57
58 // Perform some testing
59 }
60
61}テスト設定メソッドの考慮事項
- テスト設定メソッドは、テストクラスのデフォルトのデータ分離モードでのみサポートされます。テストクラスまたはテストメソッドが @isTest(SeeAllData=true) アノテーションを使用することで組織データにアクセスできる場合、そのクラスではテスト設定メソッドはサポートされません。テストのためのデータ分離を使用できるのは API バージョン 24.0 以降であるため、テスト設定メソッドを使用できるのもこれらのバージョンのみです。
- 1 つのテストクラスで複数のテスト設定メソッドを使用できますが、テストフレームワークでそれらが実行される順序は保証されません。
- テスト設定メソッドの実行中に致命的なエラーが発生した場合 (DML 操作またはアサーションの失敗によって発生した例外など)、テストクラス全体が失敗し、クラス内でそれ以降のテストは実行されません。
- テスト設定メソッドが、別のクラスの非テストメソッドをコールする場合、その非テストメソッドのコードカバー率は計算されません。