如果速度太慢,如何使性能测试失败?

时间:2016-07-14 13:29:46

标签: ios swift performance performance-testing

我希望我的测试失败,如果它的运行速度低于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.179966,0.177797,0.175820,0.205763,0.315636,0.223014,0.200362,0.178165]

2 个答案:

答案 0 :(得分:11)

您需要为性能测试设置基线。前往报告导航器:

Report Navigator

并选择您最近的测试运行。您将看到所有测试的列表,但性能测试会有时间与它们相关联。单击时间以显示“性能结果”弹出窗口:

Performance Result

&#34;基线&#34;值是您正在寻找的 - 将其设置为0.5并且将通知Xcode此测试应该在半秒内完成。如果您的测试比基线慢10%以上,它就会失败!

答案 1 :(得分:3)

与您描述的内容类似的唯一方法是以图形方式设置时间限制,如@ 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()
    })
}