こんにちは、にいるです。
今回は、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機能について紹介していますので、ご覧ください。
ではでは!
 
  
  
  
  



コメント