Help us understand the problem. What is going on with this article?

Apex テスト 備忘録

More than 1 year has passed since last update.

1.テストメソッドの雛形

@isTest
private class MyTestClass {
    @isTest
    static void testXXX() {
        // テストユーザ作成
        User testUser = TestUtil.createUser('testUser');

        // ユーザモード
        System.runAs(testUser){
            /* ======テストデータ準備====== */
            // 各SObjectデータ作成

            /* ======テストメソッド起動====== */
            Test.startTest();
            // 対象メソッドを呼び出す
            Test.stopTest();

            /* ======結果検証====== */      
            // 実行結果と期待値の検証
        }
    }
}

2.テストデータの使用範囲及び作成方式

テストデータの使用範囲は下記の種類があります。

  • 【テストメソッド内】
  • 【テストメソッド間】
  • 【テストクラス間】
    • ①テストユーティリティクラス
    • ②Test.loadData メソッド

【テストメソッド内】作成方式

@isTest
private class MyTestClass {
    @isTest static void myTest() {
        //取引先データ作成
        Account acc = new Account(Name = 'Sample Account');
        insert acc;
    }
}

【テストメソッド間】作成方式

@testSetup

@isTest
private class MyTestClass{
    @testSetup
    static void setup() {
        Account acc = new Account(Name = 'Sample Account');
        insert acc;
    }

    @isTest
    static void test1() {
        // @testSetupで作成したレコードをSOQLで取得できる
        Account acc = [SELECT Id, Name FROM Account];
    }
}

②共通メソッド

@isTest
private class MyTestClass {
    static Account acc;

    @isTest static void myTest1() {
        //取引先データ作成
        createAccount('myTest01');

        // ~~省略~~
    }

    @isTest static void myTest2() {
        //取引先データ作成
        createAccount('myTest02');

        // ~~省略~~
    }

    // 取引先テストデータ作成
    static void createAccount(String acccName) {
        //取引先データ作成
        acc = new Account(Name = acccName);
        insert acc;
    }
}

【テストクラス間】作成方式

①テストユーティリティクラス

Apexテストデータ作成の汎用化をご参照ください。

②Test.loadData メソッド

@isTest 
private class DataUtil {
    static testmethod void testLoadData() {
        List<sObject> ls = Test.loadData(Account.sObjectType, 'testAccounts');
        Account a1 = (Account)ls[0];
        String acctName = a1.Name;

        // ~~省略~~
    }
}

3.その他

System.runAs

  • レコードの共有権限でSOQLを実行する(MetaData権限無視)
  • テストクラスに混合 DML 操作許可
  • 指定パッケージバージョンの Apex クラスまたはトリガを実行する

Test.startTest / Test.stopTest

  • startとstopの間だけでガバナ制限がカウントされ、データ準備のためのコード実行分がカウントされない。
  • 非同期処理は同期として実行する

System.assertEquals / System.assert

  • System.assertEquals(期待値, 実際の値)
  • System.assert(評価の式)

Test.isRunningTest

テストクラスで実行されたかの判定

Test.getStandardPricebookId

組織内の標準価格表の ID を取得する

@TestVisible

Privateまたはprotectedメンバーはテストクラスへ公開する

テストデータパターン

  • ポジティブな動作に対するテスト
  • ネガティブな動作に対するテスト
  • 単一レコードのテスト
  • 複数レコードのテスト(トリガの場合、201件)

注意事項

  • IDをハードコーディングしない
  • できるだけ「DescribeSObjectResult.getRecordTypeInfosByDeveloperName」でレコードタイプを取得する
  • できるだけ「@IsTest(SeeAllData=true)」を使わないようにする
  • カスタム設定の代わりにカスタムデータデータ型を検討する
  • バッチ処理の対象データはBatch Sizeを超えないように考慮する必要があります。

4.Apex テスト例(※随時更新)

5.ダミーコードでリリース優先一時対応案

image.png

/**
 * ダミークラス
 * 
 */
public class DummyClass {
    public static void dummyMethod() {
        Integer i = 0;
        i = 0;
        i = 0;
        i = 0;
          
          
         // 10000行とか
    }
}
/**
 * ダミークラスのテストクラス
 * 
 */
@isTest
private class DummyClassTest {
    @isTest
    static void dummyMethodTest() {
        DummyClass.dummyMethod();
    }
}
xuwenzhen
このアカウントでの投稿は私個人の見解に基づくものです。 ご利用は自己責任でお願いいたします。
https://trailhead.com/me/xuwenzhen
Cloudway
Salesforce、Heroku、MuleSoft を開発・運営しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away