36
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Apex テスト 備忘録

Last updated at Posted at 2019-04-12

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


@isTest
private class XXXXXXTest {
    @testSetup
    static void setup() {
        // 各テストメソッドで使用できるテストデータを作成する
    }

    @isTest
    static void XXXTest() {
        System.runAs(new User(ID = UserInfo.getUserID())) {
            /* ======テストデータ準備====== */
            // 各SObjectデータ作成
            // テストデータ:取引先
            Account testDataAccount = TestDataFactory.getTestDataAccount();
            insert testDataAccount;

            /* ======テストメソッド起動====== */
            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;
    }
}

##【テストクラス間】作成方式
###①テストユーティリティクラス

TestDataFactory
/**
 * 各オブジェクトのテストデータ生成Factory
 * 
 */
@isTest
public class TestDataFactory {
    /**
     * テストデータ:取引先
     */
    public static Account getTestDataAccount() {
        // テストデータの作成
        Account testData = new Account();
        testData.Name = 'テストデータ';
        testData.NameKana__c = 'テストデータ';
        return testData;
    }

    /**
     * テストデータ:取引先責任者
     */
    public static Contact getTestDataContact() {
        // テストデータの作成
        Contact testData = new Contact();
        testData.FirstName = 'firstName';
        testData.LastName = 'lastName';
        testData.Phone='08012345678';
        testData.Email = 'xuwenzhen@gmail.com';
        return testData;
    }
}

もっと汎用化したい場合、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();
    }
}
36
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?