【Salesforce】@testSetupを使用する

【Salesforce】@testSetupを使用する

SalesforceのApex開発を行う上で欠かせないのが、テストクラスですね。

テストメソッドを作る際に、テスト用のレコードを作成することは少なくありません。

私ははstaticのメソッドを作成してテストの度に呼び出していたのですが、毎回呼び出す必要はないそうです。

@testSetupアノテーションというものがあるようですよ。

https://developer.salesforce.com/docs/atlas.ja-jp.210.0.apexcode.meta/apexcode/apex_testing_testsetup_using.htm

 

このアノテーションをテストレコードを作成するメソッドに付与すれば、テストメソッド側にその処理を記述しなくて済みますね。

また、このメソッドで作成されたレコードを使いまわしてテストメソッドを動かすようなので、大量のレコードが関連する場合にテストの処理時間が短くなるんだとか。

私はいつもこんな感じで書いてます。

/**
 * 取引先のUPDATEテスト
 */
private static testmethod updateAccountTest(){

    List<Account> accountList;
    
    // 取引先のリストを取得する
    accountList = [select Id from Account];
    
    Test.startTest();
    
    // 取引先リストのアップデートを行う
    update accountList;
    
    Test.stopTest();
}

// ↓テストレコード作成メソッド↓ //

/**
 * テスト用レコードを作成する
 */
@testSetup
private static void createTestRecord(){

    List<Account> accountList;
    List<MasterRecord__c> masterList;
    
    // 取引先のリストを作成する
    accountList = createAccountList();
    insert accountList;
    
    // マスタレコードのリストを作成する
    masterList = createMasterList();
    insert masterList;
}

/**
 * 取引先のリストを作成する
 * @return 作成した取引先のリスト
 */
private List<Account> createAccountList(){
    
    List<Account> accountList;
    
    // 取引先のリストを作成する
    accountList = new List<Account>();
    // 取引先1
    accountList.add(
        new Account(
            Name = 'TestAccount1';
        )
    );
    
    return accountList;
}

/**
 * マスタレコードのリストを作成する
 * @return 作成した取引先のリスト
 */
private List<MasterRecord__c> createMasterList(){
    
    List<MasterRecord__c> masterList;
    
    // マスタレコードのリストを作成する
    masterList = new List<MasterRecord__c>();
    // 取引先1
    masterList.add(
        new MasterRecord__c(
            Name = 'TestAccount1';
        )
    );
    
    return masterList;
}

レコードを作成する処理をTestUtilクラスなんかに記述して、createTestRecordはそれを呼ぶだけみたいにすることも多いです。

この場合に注意が必要なのは、ガバナ制限はリセットされないことです。

SOQLを何度も呼ぶようなトリガが存在する場合なんかは注意が必要ですね。

基本的にはカスタム設定のレコードやマスタレコードなどで使うことが多いです。

簡単に使えてメリットが多いため、使っていない方は使ってみるといいかもしれません。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です