ios swift xcode performance-testing xctest

ios - ¿Cómo puedo ejecutar mis pruebas de rendimiento más de diez veces?



swift xcode (2)

La respuesta corta: No, no hay una interfaz actual expuesta para permitir un bloque de medida más de diez veces.

La respuesta más larga: No, pero hay una interfaz expuesta para modificar ciertas métricas del bloque de medida. Las métricas predeterminadas están en una matriz de cadenas devuelta desde defaultPerformanceMetrics . Parece que solo se admite una métrica en este momento: XCTPerformanceMetric_WallClockTime . Esto solo especifica una métrica de rendimiento que registra el tiempo en segundos entre las llamadas a los startMeasuring() y stopMeasuring() una prueba de rendimiento, y no la cantidad de veces que se ejecuta el bloque.

Por defecto, las pruebas de rendimiento de Xcodes se ejecutan diez veces y mi resultado es el promedio de esas diez pruebas. El problema es que el resultado promedio varía considerablemente cada vez que lo ejecuto, así que tengo que ejecutar la prueba al menos cinco veces para obtener un resultado convergente. Esto es tedioso y consume mucho tiempo; ¿Hay alguna forma de configurar XCode o la propia prueba de unidad para que se ejecute más de diez veces?


un volcado de clase de XCTestCase expone este método:

- (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;

cuando este método está desviado, el primer parámetro (arg1) tiene las 10 duraciones:

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

Agregué 4 nuevos valores (1.0, 2.0, 3.0, 4.0) al final de esta lista antes de devolverla a la implementación original, pero desafortunadamente una clase diferente que observa, XCTestLog , tiene un control de XCTestLog interno que se dispara:

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."

Una vez que el método XCTestLog también se invalida para que no se afirme, los 4 valores adicionales se pueden agregar sin ninguna queja. desafortunadamente la vista solo muestra los 10 resultados.

Sin embargo, sí actualiza el tiempo total + los valores de desviación estándar en la mini vista.

Antes de swizzling

Después de Swizzling y sumando 4 valores.

para ver más de 10 resultados, probablemente habría que modificar el tiempo de ejecución de XCode para indicar a la tabla que muestre más elementos.