2016-07-30 34 views
18

默認情況下,Xcode性能測試運行十次,我的結果是這十次測試的平均值。問題是每次運行它時平均結果差異很大,所以我必須至少運行五次測試才能獲得收斂結果。這既乏味又費時。有沒有辦法配置XCode或單元測試本身運行10次以上?我如何運行我的性能測試超過十次?

enter image description here

回答

8

XCTestCase的一類轉儲公開此方法:

- (void)_recordValues:(id)arg1 forPerformanceMetricID:(id)arg2 name:(id)arg3 unitsOfMeasurement:(id)arg4 baselineName:(id)arg5 baselineAverage:(id)arg6 maxPercentRegression:(id)arg7 maxPercentRelativeStandardDeviation:(id)arg8 maxRegression:(id)arg9 maxStandardDeviation:(id)arg10 file:(id)arg11 line:(unsigned long long)arg12; 

當這種方法被交叉混合的第一個參數(ARG1)具有10周的持續時間:

["0.003544568", 
"0.003456569", 
"0.003198263", 
"0.003257955", 
"0.003508724", 
"0.003454298", 
"0.003461192", 
"0.00423787", 
"0.003359195", 
"0.003335757"] 

我加入4-新值(1.0 ,2.0,3.0,4.0)到該列表的末尾,然後將其傳遞迴原始實現,但不幸的是,觀察到的不同類別XCTestLog具有內部完整性檢查,其被觸發:

Assertion failure in +[XCTestLog _messageForTest:didMeasureValues:forPerformanceMetricID:name:unitsOfMeasurement:baselineName:baselineAverage:maxPercentRegression:maxPercentRelativeStandardDeviation:maxRegression:maxStandardDeviation:file:line:] 
caught "NSInternalInconsistencyException", "Performance Metrics must provide 10 measurements." 

一旦XCTestLog方法也被覆蓋,所以它不會斷言,額外的4個值可以添加沒有任何抱怨。不幸的是,這個視圖仍然只顯示了10個結果。

但它確實更新了迷你視圖中的總時間+標準偏差值。

前交叉混合

Before Swizzle

交叉混合後,爲了觀看超過10個結果中添加4個值 After Swizzle

人們可能必須調整Xcode的運行時告訴該表顯示更多項目。

+0

這是否工作正常?對於三個新條目,從0.003秒增加到0.717秒似乎有點多。 – Deco

+0

是的,這工作正確。原始10個值的平均值爲0.00348,並且14(在加入1,2,3,4後)值的平均值爲0.71677 – Casey

+0

(0.003544568 + 0.003456569 + 0.003198263 + 0.003257955 + 0.003508724 + 0.003454298 + 0.003461192 + 0.00423787 + 0.003359195 + 0.003335757 + 1 + 2 + 3 + 4)/ 14 – Casey

4

簡短的回答:不,沒有暴露,以允許十次測量塊更沒有電流接口。

更長的回答:不,但有一個接口暴露在修改度量塊的某些指標。默認指標位於從defaultPerformanceMetrics返回的字符串數組中。目前似乎只支持一項指標:XCTPerformanceMetric_WallClockTime。這僅指定一個性能指標,記錄調用性能測試的startMeasuring()stopMeasuring()方法之間的時間(以秒爲單位),而不記錄該塊運行的次數。

相關問題