[Salesforce開発] Apex:テスト設定メソッドで作成したデータはテストメソッド単位でロールバックされる

目次

テスト設定メソッドで作成したデータはテストメソッド単位でロールバックされる

SFエンジニア

Apexのテストクラスを作ってテストしてるんだけど、うまくいかないので教えてくれぃ。

SF宣教師

どんな風にうまくいきませんか?

SFエンジニア

テストメソッドを3つ並べてるんだけど、データが前のメソッドの結果を引き継いでくれん。

SF宣教師

テストメソッド間でレコードに変更した結果は引き継がれませんよ。

模擬設問

テスト設定メソッド (@testSetup アノテーションが付加されたメソッド) を使用して、テストレコードを作成する場合に間違えやすいポイントです。

@isTest
private class CreateAndExecuteTest {
	@testSetup
    static void setup() {
        //Create 2 test accounts
        List<Account> testAccts = new List<Account>();
        for(Integer i=0; i<2; i++) {
            testAccts.add(new Account (Name='MyTestAccount'+i, Phone='333-870'+i));
        }
        insert testAccts;
    }
    @isTest
    static void testMethod1() {
        Account acc = [SELECT Id, Phone FROM Account WHERE Name='MyTestAccount0'];
        acc.Phone='888-1515';
        update acc;
        Account acc2 =  [SELECT Id, Phone FROM Account WHERE Name='MyTestAccount1'];
        acc2.Phone='999-1515';
        update acc2;
        System.debug('1.acc.Phone=' + acc.Phone + ' acc2.Phone=' + acc2.Phone);
    }
    @isTest
    static void testMethod2() {
        Account acc = [SELECT Id, Phone FROM Account WHERE Name='MyTestAccount0'];
        Account acc2 = [SELECT Id, Phone FROM Account WHERE Name='MyTestAccount1'];
        acc2.Phone='888-2525';
        update acc2;
        System.debug('2.acc.Phone=' + acc.Phone + ' acc2.Phone=' + acc2.Phone);
    }  
    @isTest
    static void testMethod3() {
        Account acc0 = [SELECT Id, Phone From Account WHERE Name='MyTestAccount0'];
        Account acc1 = [SELECT Id, Phone From Account WHERE Name='MyTestAccount1'];
        System.debug('3.Account0.Phone=' + acc0.Phone + ' Account1.Phone=' + acc1.Phone);
    }
}
上記のコードを実行したときに、testMethod3のデバッグ文で出力される結果はどうなりますか?
A. 3.Account0.Phone=888-1515 Account1.Phone=888-2525
B. 3.Account0.Phone=333-8700 Account1.Phone=888-2525
C. 3.Account0.Phone=333-8700 Account1.Phone=333-8701
D. 3.Account0.Phone=888-1515 Account1.Phone=888-2525
正解を表示

正解:C

解説

テスト設定メソッド (@testSetup アノテーションが付加されたメソッド) を使用して、テストクラスでテストレコードを1回作成し、各テストメソッド(@isTestアノテーションが付加されたメソッド)でそれらのレコードにアクセスすることができますが、テストメソッド間でレコードに変更した結果は引き継がれません。

@testSetupアノテーション
Apexテストクラス内で使用されるアノテーションの1つです。このアノテーションは、テストデータのセットアップを効果的に行うために使用されます。
@testSetupアノテーションを使用すると、Apexテストクラス内でテストメソッドが実行される前に、指定したメソッドが実行されるようになります。このメソッド内でテストデータを作成および挿入することができます。これにより、複数のテストメソッドで同じテストデータを再利用することができ、テストの効率性と一貫性を向上させることができます。

@isTestアノテーション
Apexコード内で使用されるアノテーションの1つです。このアノテーションは、Apexクラスやメソッドをテストクラスやテストメソッドとして識別するために使用されます。
@isTestアノテーションをクラスまたはメソッドに付けることで、それらがテスト対象であることを示し、テストランナーがそのコードをテストとして実行するようになります。テスト対象のコードは、実際のビジネスロジックをテストし、期待どおりの動作を確認するために使用されます。

APEX開発者ガイドからの抜粋

テストクラスにテスト設定メソッドが含まれる場合、テストフレームワークは、テスト設定メソッドを最初に実行してから、そのクラスの他のテストメソッドを実行します。テスト設定メソッドで作成されたレコードは、テストクラス内のすべてのテストメソッドで使用でき、テストクラス実行終了時にロールバックされます。レコード項目の更新やレコード削除など、テストメソッドがこれらのレコードを変更した場合、その変更は、各テストメソッドの実行終了後にロールバックされます。次に実行されるテストメソッドは、元の変更されていない状態のレコードにアクセスできます。

Apex 開発者ガイド:Apex のデバッグ、テスト、リリース/Apex のテスト/テストデータについて/テスト設定メソッドの使用
SF宣教師

以上になります。

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

コメント

コメントする

目次