Результат покрытия кода не соответствует реальному охвату в Xcode 7
Я запускаю тестовые примеры в приложении с включенными данными о покрытии кода Xcode 7 Beta 2. Но я могу получить только несколько данных покрытия файлов, в то время как все мои тестовые примеры успешно выполняются.
Некоторые файлы покрывали все коды с помощью unit test случаев, но все же отображали 3% -ный охват кода.
Например:
Это результат покрытия кода, как вы можете видеть на правой стороне, есть информация, сколько раз эти строки кода вызывались во время тестов. В этом случае - 0.
Но...
здесь есть место в тестах, где мы видим, что эта функция действительно называется. Сколько раз? ой... хотя бы один раз. Этот номер доставляется информацией с правой стороны.
Таким образом, код выше должен быть отмечен как вызванный, а не быть серым: -)
Кто-нибудь может это объяснить? Почему это происходит?
Ответы
Ответ 1
ЭТО РАБОТАЕТ.
- Так как Apple выпустила ключевое слово @testable, чтобы импортировать проект в тестовую цель, вам больше не нужно добавлять файлы в оба целевых объекта:
![введите описание изображения здесь]()
- Так что просто удалите каждый файл из тестовой цели:
![введите описание изображения здесь]()
- Если вам нужен доступ к вашему файлу из тестовой цели, просто импортируйте свою цель, используя:
@testable import MyApp
![введите описание изображения здесь]()
- Сделайте это для каждого файла в вашем проекте.
Тогда покрытие кода будет работать нормально.
Подробнее из Swift 2 + Xcode 7: доступ к модульному тестированию упрощен!!!!
Если вам нужно знать, как работать с охватом кода, прочитайте Как использовать покрытие кода в Xcode 7?
Как упоминалось ранее в @Gerd Castan: "Мне кажется, что проверенный метод показывает охват 0, когда существует хотя бы одна цель, где этот метод не проверен".
Решение прост. Не позволяйте компилятору думать, что этот файл включен в более чем одну цель, вместо этого импортируйте свой модуль с помощью ключевого слова @testable
.
Ответ 2
Я проверил на форумах разработчиков Apple тему, и после прочтения различных сообщений, я думаю, я нашел решение.
Чтобы работа работала, необходимо:
- Удалите все исходные файлы приложения из целевой цели.
- В ваших тестовых источниках поставьте
@testable import <NameOfYourModule>
- Повторно выполнить и повторно запустить тесты
Я проверил это с моим текущим проектом, и результаты намного лучше.
Оригинальный рецепт решения можно найти по адресу: http://natashatherobot.com/swift-2-xcode-7-unit-testing-access/
Также кажется, что функциональность немного грубая, поэтому возможны ошибки, и Apple предлагает отправлять отчеты об ошибках, когда что-то не работает должным образом:
Я лично видел результаты покрытия кода для некоторых очень больших проектов. Сейчас поддержка лучше всего подходит для приложений и фреймворков. Если это то, что вы тестируете, тогда было бы лучше, если бы вы могли отправить отчет об ошибке в https://bugreport.apple.com, чтобы мы могли исследовать ваш конкретный обстоятельства. В этом отношении отчет об ошибках будет хорошим, независимо от того, какой у вас проект. Если возможно, лучше всего на самом деле в проекте с докладом. Если вы не можете этого сделать, опишите его настройку как можно подробнее. Фотографии хороши.
Исходная тема: https://forums.developer.apple.com/message/9733#9733
Ответ 3
Я думаю, что узнал, что делает XCTest-покрытие, и это имеет смысл:
Моя настройка:
class1, скомпилированный в target1
class2, скомпилированный в target1 и в target2
Настройка теста:
import XCTest
@testable import target1
class MyTests: XCTestCase {
func testSomething() {
someMethodFromClass1()
someMethodFromClass2()
}
}
То, что я нахожу, это то, что class1 (скомпилированный в target1) показывает покрытие теста, а класс2 (скомпилированный в target1 и в target2) не показывает охват тестированием.
Итак, мне кажется, что проверенный метод показывает охват 0, когда существует хотя бы одна цель, где этот метод не проверен.
И это имеет большой смысл, потому что тестирование метода в цели ничего не говорит о том, как он ведет себя в другой цели.
Apple хочет, чтобы мы тестировали все цели.
Обновление
Еще один намек на поддержку этой теории:
перейти к навигатору отчетов
![навигатор отчетов]()
и нажмите на зону покрытия.
Если у вас более одной цели, вы видите ваши файлы, сгруппированные по целевым.
И если у вас есть один файл в двух целях, вы увидите свой файл дважды.
Если у вас есть один файл в обеих целях, для обоих целей отображается охват кода этого одного файла. И (по крайней мере, в моих проектах) один файл имеет разные синие линии в каждой цели:
охват цели 1:
![target 1]()
охват одного и того же файла в том же проекте в том же тестовом прогоне в целевом 2:
![target 2]()
Если вы посмотрите на тестовое покрытие в исходном редакторе, Apple должна решить, какой охват он вам покажет.
Я думаю, что показать цель с самым низким охватом - лучшее яблоко, которое можно сделать в редакторе исходного кода.
простое исправление для специального случая:
Если ваша единственная вторая цель - ваша тестовая цель: не компилируйте ее в целевую аудиторию и не используйте @testable import
.
Для всех остальных случаев вам нужно проверить каждую цель.
Ответ 4
Помните, что существует множество способов охвата кода с помощью тестов, вы можете протестировать все функции или вы можете покрывать все инструкции в функциях, но вы не можете покрывать все возможные пути выполнения.
Или материал для покрытия Xcode может быть поврежден, но сложно сказать, не указали ли вы, какой вид покрытия вы ожидаете проверить.
Ответ 5
Это происходит из-за того, что по умолчанию выбран файл .swift вашего проекта для обеих целей.
Вручную выбирать и удалять тестовую цель для файлов работает для меня.