目次
テスト設定メソッドで作成したデータはテストメソッド単位でロールバックされる
SFエンジニア
Apexのテストクラスを作ってテストしてるんだけど、うまくいかないので教えてくれぃ。
どんな風にうまくいきませんか?
テストメソッドを3つ並べてるんだけど、データが前のメソッドの結果を引き継いでくれん。
テストメソッド間でレコードに変更した結果は引き継がれませんよ。
模擬設問
テスト設定メソッド (@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アノテーションが付加されたメソッド)でそれらのレコードにアクセスすることができますが、テストメソッド間でレコードに変更した結果は引き継がれません。
APEX開発者ガイドからの抜粋
テストクラスにテスト設定メソッドが含まれる場合、テストフレームワークは、テスト設定メソッドを最初に実行してから、そのクラスの他のテストメソッドを実行します。テスト設定メソッドで作成されたレコードは、テストクラス内のすべてのテストメソッドで使用でき、テストクラス実行終了時にロールバックされます。レコード項目の更新やレコード削除など、テストメソッドがこれらのレコードを変更した場合、その変更は、各テストメソッドの実行終了後にロールバックされます。次に実行されるテストメソッドは、元の変更されていない状態のレコードにアクセスできます。
Apex 開発者ガイド:Apex のデバッグ、テスト、リリース/Apex のテスト/テストデータについて/テスト設定メソッドの使用
以上になります。
コメント