2016-07-14 174 views
11

如果運行速度低於0.5秒,我希望我的測試失敗,但平均時間僅在控制檯中打印,並且找不到訪問它的方法。有沒有辦法訪問這些數據?如果性能測試太慢,性能測試會失敗嗎?

代碼

//Measures the time it takes to parse the participant codes from the first 100 events in our test data. 
func testParticipantCodeParsingPerformance() 
{ 
    var increment = 0 
    self.measureBlock 
    { 
     increment = 0 
     while increment < 100 
     { 
      Parser.parseParticipantCode(self.fields[increment], hostCodes: MasterCalendarArray.getHostCodeArray()[increment]) 
      increment++ 
     } 
    } 
    print("Events measured: \(increment)") 
} 

測試數據

[Tests.ParserTest testParticipantCodeParsingPerformance]」測量[時間,秒]平均值:0.203,相對標準偏差:19.951%,值: [0.186405,0.182292,0.1179966,0.1777797,0.1175820,0.205763,0.315636,0.223014,0.200362,0.178165]

回答

8

您需要爲性能測試設置基準。頭向報告導航:

Report Navigator

,並選擇您最近的測試運行。您會看到所有測試的列表,但表現的測試將與其關聯。點擊時,彈出性能結果酥料餅:

Performance Result

「基線」值是您要查找的內容 - 將其設置爲0.5秒,這將告知XCode此測試應該在半秒鐘內完成。如果你的測試比基線慢10%以上,它就會失敗!

+1

這些工作得很好,但他們只在我的機器上本地工作,我使用Git爲我的項目和所有其他用戶沒有設置基線。有沒有辦法在git項目中包含這個基線? – Deco

+0

我發現這個做了這個工作 https://stackoverflow.com/a/46563991/957245 – Deco

2

執行類似於您所描述的操作的唯一方法是像@ andyvn22建議的那樣以圖形方式設置時間限制。但是,如果你想在代碼中完全做到這一點,你可以做的唯一事情就是用一個新的方法來擴展XCTestCase,它測量閉包的執行時間,並返回它在斷言中使用,這裏是一個例如,你可以做什麼:

extension XCTestCase{ 
    /// Executes the block and return the execution time in millis 
    public func timeBlock(closure:()->()) -> Int{ 
     var info = mach_timebase_info(numer: 0, denom: 0) 
     mach_timebase_info(&info) 
     let begin = mach_absolute_time() 

     closure() 

     let diff = Double(mach_absolute_time() - begin) * Double(info.numer)/Double(1_000_000 * info.denom) 
     return Int(diff) 
    } 
} 

而且隨着使用它:

func testExample() { 
    XCTAssertTrue(500 < self.timeBlock{ 
     doSomethingLong() 
    }) 
}