Как выполнить тест производительности, если он слишком медленный?

Я бы хотел, чтобы мой тест завершился неудачей, если он работает медленнее, чем 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]

Ответ 1

Вам необходимо установить базовый уровень для теста производительности. Направляйтесь к Навигатору отчетов:

Навигатор отчетов

и выберите недавний пробный прогон. Вы увидите список всех ваших тестов, но их производительность будет иметь время, связанное с ними. Нажмите время, чтобы открыть всплывающее окно Performance Result:

Результат производительности

Значение "Базовая линия" - это то, что вы ищете - установите его на 0,5 с, и это сообщит Xcode, что этот тест должен завершиться через полсекунды. Если ваш тест более чем на 10% медленнее базового уровня, он не пройдет!

Ответ 2

Единственный способ сделать что-то похожее на то, что вы описываете, - установить графику времени, графически, как рекомендует @andyvn22.

Но если вы хотите сделать это полностью в коде, единственное, что вы можете сделать, это расширить XCTestCase новым методом, который измеряет время выполнения закрытия и возвращает его для использования в assertiong, вот пример что вы могли бы сделать:

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()
    })
}