Apex 單元測試輔助函數簡介


startTest和stopTest的使用

在Apex的Test類中,有startTest和stopTest兩個函數。這兩個函數經常配對使用。

每個單元測試函數都只能調用它們一次。

  • 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被調用后,便只能再執行1條SOQL了。

isRunningTest()

isRunningTest()方法存在於Apex的Test類中,可以在代碼中用於檢測當前執行的代碼是否是單元測試。

語法

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

使用情況舉例

  1. 在為單元測試創建測試數據時,如果系統中已經有了很多相關的觸發器(trigger),而此單元測試並不是為了測試它們,那么這些觸發器也仍然會被執行。執行過多的觸發器一方面會降低系統效率,另一方面也可能引發其他的錯誤。為了避免這些問題,可以在觸發器類中使用isRunningTest()函數來跳過某些邏輯的執行。

  2. 在Visualforce的標准控制器擴展中,可以使用addFields()函數來讀取更多的字段。但是當創建單元測試時,addFields()的執行會導致測試出錯。這時就要在執行addFields()前用isRunningTest()檢測當前的執行是否是單元測試。
    比如:

public ExtensionExample(ApexPages.StandardController controller)
{
    List<String> fields = new List<String> {'Custom_field1__c', 'Custom_field2__c'};
    
    // 當進行單元測試時,跳過addFields()的執行
    if (!Test.isRunningTest()) {
        controller.addFields(fields); 
    }

    // 為了增加代碼測試的覆蓋率,也可以將上面的代碼寫成一行,這樣就可以全部覆蓋了
    // if (!Test.isRunningTest()) controller.addFields(fields); 

    record = (Account)controller.getRecord();

    ...
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM