Неправильное покрытие кода внутри цикла for - PullRequest
0 голосов
/ 07 мая 2018

Здравствуйте, товарищи по переполнению,

Я работаю над классом Swift, инициализатор которого содержит цикл for, который выполняется определенное количество раз в соответствии с параметром init. К сожалению, я не могу показать вам точный код, но он похож на это:

init(numberOfTimes: Int) {
    ...
    for index in 0..<numberOfTimes {
        // do some stuff here
        // shows 0 coverage
    }
    ...
}

У меня есть несколько модульных тестов для этого инициализатора, выполняющих цикл for от 0 до 5 раз. Тесты пройдены, но покрытие кода всегда помечает внутри цикла как не охваченное, даже если оно четко выполняется - я могу установить точку останова внутри цикла, и каждая функция, вызываемая в цикле, отображается как покрытая.

Кроме того, если я извлечу содержимое цикла for, код действительно будет выглядеть покрытым, и общее покрытие кода класса увеличится почти на 20%:

init(numberOfTimes: Int) {
    ...
    for index in 0..<numberOfTimes {
        doOne(index)
        // this part still shows 0 coverage
    }
    ...
}

private func doOne(_ index: Int) {
    // do same things here
    // shows correct coverage
}

Почему это происходит? Не отвечаю ли я правильным критериям покрытия кода внутри цикла for?

1 Ответ

0 голосов
/ 08 мая 2018

Я полагаю, что это может быть ошибка, о которой вы говорите:

https://bugs.swift.org/browse/SR-7446

После обновления до Xcode 9.3 / Swift 4.1 я заметил, что покрытие кода процент упал в нескольких моих проектах.

Ошибка возникает, когда я использую условный код в инициализатор ...

Что было исправлено в:

https://github.com/apple/swift/pull/15966

Эта схема использования назначенного конструктора для профилирования немного хрупкая. Одна конкретная проблема, связанная с этим, заключается в том, что swift в конечном итоге пытается создать отдельные SILProfilers для разных конструкторов номинального типа, и инициализаторы хранимых свойств, которые мы хотим охватить, могут не передаваться в назначенный конструктор.

Более простая идея - хранить карту от номинальных типов до SILProfilers, а затем создать единый объединенный экземпляр профилировщика для всех конструкторы номинального типа.

...