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