Apexユニットテスト補助関数の概要

1703 ワード

startTestとstopTestの使用


ApexのTestクラスにはstartTestとstopTestの2つの関数があります.この2つの関数はよくペアで使用されます.
各ユニットテスト関数は、1回のみ呼び出すことができます.
  • startTest関数は、テストの開始を示しています.使用する前に、テストデータが確立されたはずです.
  • stopTest関数は、テストの終了を示しています.startTestとstopTestの間で呼び出されたすべての非同期関数が同期して実行されます.したがってstopTestの後にassert文を使用して非同期関数の実行結果を確認できます.

  • startTestとstopTestの間で、コード内の制限(Apex Governor Limits)が新しい計算を行います.stopTestが呼び出されるまで、ApexのGovernor LimitsはstartTestが呼び出される前から計算を続けます.
    たとえば、Salesforceでの関数のSOQL呼び出し制限は100です.startTestの前に99個のSOQLが実行されている場合、startTest呼び出しの後に100個のSOQLを実行することもできます.stopTestが呼び出されると、SOQLはもう1つしか実行できません.

    isRunningTest()


    isRunningTest()メソッドはApexのTestクラスに存在し、現在実行されているコードがユニットテストであるかどうかをコードで検出することができる.

    構文

    if (Test.isRunningTest()) {
        // do something
    }
    

    使用例

  • ユニットテストのテストデータを作成するとき、システムに関連するトリガ(trigger)が多数存在し、このユニットテストがテストのためではない場合、これらのトリガも実行されます.トリガを実行しすぎると、システムの効率が低下する一方で、他のエラーを引き起こす可能性があります.これらの問題を回避するために、トリガクラスでisRunningTest()関数を使用して、いくつかの論理の実行をスキップすることができます.
  • Visualforceの標準コントローラ拡張では、addFields()関数を使用してより多くのフィールドを読み込むことができます.しかし、ユニットテストを作成すると、addFields()の実行によってテストエラーが発生します.このときaddFields()を実行する前にisRunningTest()で現在の実行がユニットテストであるかどうかを検出します.例えば:
  • public ExtensionExample(ApexPages.StandardController controller)
    {
        List fields = new List {'Custom_field1__c', 'Custom_field2__c'};
        
        //  , addFields() 
        if (!Test.isRunningTest()) {
            controller.addFields(fields); 
        }
    
        //  , , 
        // if (!Test.isRunningTest()) controller.addFields(fields); 
    
        record = (Account)controller.getRecord();
    
        ...
    }