こんにちは、にいるです。
今回は、Apexの「テストクラスの書き方」について、書いてみたいと思います。
・【ヘルプ】Test クラス
・【ヘルプ】ベストプラクティスのテスト
1.テストクラスとは
テストクラスとは、作成したApexクラスが正常に動くかどうかを検証するための機能です。
品質の確認に使用される値は、コードカバー率で最大100%です。
単体テストのコードカバー率が75%を超えていて、テストクラスの全テストメソッドが成功していればリリースが可能になります。
Apexクラスを書くことができれば、テストクラスも問題なく書けると思います。
ただテスト特有のメソッドやアノテーションがあるので、そこは新しく理解しなければいけないポイントです。
2.テストクラスの書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
@isTest private class testclass{ // ① テストデータを作成するメソッド @testSetup static void setup() { List<Account> testAccts = new List<Account>(); for ( Integer i=0;i<2;i++ ) { testAccts.add(new Account(Name = 'MyTestAccount'+i, Phone ='333-878'+i)); } insert testAccts; } // ② テストメソッド1 @isTest static void testMethod1() { // ③ 更新後の電話番号を確認 Account acc0 = [SELECT Id,Phone FROM Account WHERE Name ='MyTestAccount0' LIMIT 1]; acc0.Phone = '888-1515'; update acc0; Account acc1 = [SELECT Id,Phone FROM Account WHERE Name ='MyTestAccount1' LIMIT 1]; acc1.Phone = '999-1515'; update acc1; System.debug('●acc0.Phone● = '+ acc0.Phone); System.debug('●acc1.Phone● = '+ acc1.Phone); } // ④ テストメソッド2 @isTest static void testMethod2() { List<Account> accList = new List<Account>(); Account acc0 = [SELECT Id, Phone FROM Account WHERE Name ='MyTestAccount0' LIMIT 1]; Account acc1 = [SELECT Id, Phone FROM Account WHERE Name ='MyTestAccount1' LIMIT 1]; // ⑤ テストデータを取得 System.debug('Account0.Phone='+ acc0.Phone +', Account1.Phone='+acc1.Phone); accList.add(acc0); accList.add(acc1); // ⑥ getDMLStatementsでDML実行回数を確認 System.debug('●Start前●' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.Test.startTest(); System.debug('●Start後●' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); Database.DeleteResult[] results = Database.delete(accList, false); System.Test.stopTest(); System.debug('●Stop後●' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); } } |
①テストクラスで使用するテストデータを@setupアノテーションが付与されたメソッドで作成します。
②テストメソッド1です。(テストメソッドは自由に追加できます。)
③テストデータを更新しています。
④テストメソッド2です。
⑤今度は@setupで作成したテストデータをメソッド2で呼び出しています。
⑥Test.startTest〜Test.stopTest間でガバナ制限がリセットされていることを確認しています。
②テストメソッド1です。(テストメソッドは自由に追加できます。)
③テストデータを更新しています。
④テストメソッド2です。
⑤今度は@setupで作成したテストデータをメソッド2で呼び出しています。
⑥Test.startTest〜Test.stopTest間でガバナ制限がリセットされていることを確認しています。
■デバッグ結果
ここで覚えておきたいのが、Test.startTest〜Test.stopTestで行う処理には新しいガバナ制限のセットが付与されることです。
なので、@setupでどれだけSOQLやDMLを実行していても、このTest.startTest〜Test.stopTestを使用すれば、正しいガバナ制限を考慮した設計ができます。
また、テストデータをメソッドで更新しても、そのメソッド内では更新されますが、他のメソッド実行時には@setupで作成されたテストデータにリセットされます。
これはsetupメソッドが静的であるためです。
3.テストクラス作成の考慮事項
4.まとめ
いかがでしたでしょうか。
テストクラスは開発する上で必ず必要な機能です。
単体で75%以上のカバー率が必要となりますが、できる限り100%で実装できるように努めましょう。
皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!