Есть ли способ запустить тест с использованием XCTest несколько раз только с разными значениями?

#swift #xcode #xctest #playgrounds

#swift #xcode #xctest #игровые площадки

Вопрос:

В настоящее время я работаю над проектом, пытаясь определить, сколько времени требуется различным алгоритмам сортировки для сортировки массивов разного размера. Чтобы измерить время, я решил использовать XCTest в Swift Playgrounds, поскольку он может автоматизировать процесс многократного запуска алгоритма и его усреднения. Но у меня есть проблема с этим методом, потому что мне нужно протестировать массив большого размера от 15 элементов до 1500 или около того, с интервалом в 5 элементов (т. Е. 15 элементов, 20 элементов, 25 элементов …).

Единственный способ, которым я смог сделать это с помощью одного теста, — это несколько функций разного размера и измерение производительности. Вот пример того, как это выглядит:

 class insertionSortPerformanceTest: XCTestCase {
    func testMeasure10() {
        measure {
            _ = insertionSort(arrLen: 10)
        }
    }
    func testMeasure15() {
        measure {
            _ = insertionSort(arrLen: 15)
        }
    }
    func testMeasure20() {
        measure {
            _ = insertionSort(arrLen: 20)
        }
    }
}
  

insertionSort() работает путем генерации массива длины arrLen и заполнения его случайными числами.

Есть ли способ как-то автоматизировать этот процесс?

Кроме того, есть ли способ вывести вывод в консоль и сохранить его в виде строки, чтобы я мог проанализировать его для получения соответствующей информации позже?

Комментарии:

1. Я не могу помочь с последней частью, но вы не можете проверить производительность на игровых площадках.

2. @Alexander-RestorateMonica Вы уверены? Потому что я могу получить результат measure , когда я запускаю его на своей игровой площадке.

3. Конечно, но это время выполнения неоптимизированного кода, которое совершенно бессмысленно. Отладочные сборки оптимизируются для быстрой компиляции. Игровые площадки еще больше снижают производительность, добавляя всевозможные перехваты для обновления пользовательского интерфейса (для заполнения превью на боковой панели). Вам нужна оптимизированная сборка релиза, которая требует больше времени для компиляции, но чьи измерения на самом деле могут что-то значить. Например. forEach вызовы могут выполняться медленнее, чем for циклы в отладочной сборке, потому что они могут не быть встроены (в оптимизированной сборке они создают один и тот же код)

4. @Alexander-RestorateMonica Вы знаете, как я мог бы этого добиться?

5. Проверьте forums.swift.org/t/how-do-i-set-up-a-performance-test-suite /…