Как выполнить тест производительности, если он слишком медленный?
Я бы хотел, чтобы мой тест завершился неудачей, если он работает медленнее, чем 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()
})
}