技術メモ(主に自分向け)

短期記憶の自分向けの技術メモです。

Apexテストクラスの書き方メモ

Apexのテストクラスを書く時の備忘録
テストのカバレッジは75%以上をキープする

・テストクラスの作成方法
普段のApexクラス作成と同じ
開発者コンソール>File>New>Apex Class
作成したクラスの一番上に「@isTest」をつける。


・テストレコード作成
テストクラスのメソッドには「@isTest」をつける。
テスト開始:Test.startTest();
テスト終了:Test.stopTest();
ユーザを指定してApexを実行:System.tunAs(ユーザ){}
以下のような使い方をする。

@isTest
static void testMethod() {
 User usr = [SELECT Id, Name FROM User WHERE Username = 'xxx']; 
 Test.startTest();
 System.runAs(usr) {…}
 Test.stopTest();
}


テストレコードを作りたいときは以下の方法がある。

【方法1】
アノテーション@TestSetup
本クラス内すべてのテストメソッドで使用できるテストレコードの作成
(例)

@TestSetup
static void setup() {
 Account acc = new Account(Name = 'xxx');
 insert acc;
 
 Contact con = new Contact(
   LastName = 'x1', 
   FirstName = 'x2', 
   Email = 'x3@xxx.com', 
   HomePhone = '0000000000', 
   Phone = '0000000000', 
   Birthdate = Date.newInstance(2000, 1, 1), 
   AccountId = acc.Id);
 insert con;
 
 User usr = new User(
   Username = 'y1', 
   Email = 'x1@xxx.com', 
   LastName = 'x1', 
   FirstName = 'x2', 
   Alias = 'y2', 
   TimeZoneSidKey = 'Asia/Tokyo', 
   LocalSidKey = 'ja_JP', 
   ProfileId = [SELECT Id FROM profile WHERE Name = 'zzz'].id, 
   CommunityNickname = 'y3', 
   Phone = '0000000000', 
   LanguageLocaleKey = 'ja', 
   EmailEncodingKey = 'ISO-2022-JP', 
   contactId = con.Id);
 insert usr;
}

各メソッドでテストレコードをgetしたい場合、以下のようにプライベートメソッドを作っておくと
使いまわせて便利。

private static User getContact(String conId) {
 return [SELECT Id FROM Contact WHERE Id = conId ];
}
@isTest
static void testMethod() {
 Contact con = getContact('xxxxxxxx');
}


【方法2】
テストメソッドに直接書く
※テストレコードを書く場所に注意。
SFDC環境によってテスト開始(runAs()やstartTest())後に書くとうまくいかないことがある
→権限によって処理できない可能性があるため。
 テスト開始前にテストレコードを取得する。

@isTest
static void testMethod() {
 Account acc = new Account(Name = 'xxx');
 insert acc;
 User usr = [SELECT Id, Name FROM User WHERE Username = 'xxx'];
 
 Test.startTest();
 System.runAs(usr) {…}
 Test.stopTest();
}