Подтвердить что ты не робот

Результат покрытия кода не соответствует реальному охвату в Xcode 7

Я запускаю тестовые примеры в приложении с включенными данными о покрытии кода Xcode 7 Beta 2. Но я могу получить только несколько данных покрытия файлов, в то время как все мои тестовые примеры успешно выполняются.

Некоторые файлы покрывали все коды с помощью unit test случаев, но все же отображали 3% -ный охват кода.

Например:

enter image description here Это результат покрытия кода, как вы можете видеть на правой стороне, есть информация, сколько раз эти строки кода вызывались во время тестов. В этом случае - 0.

Но...

enter image description here здесь есть место в тестах, где мы видим, что эта функция действительно называется. Сколько раз? ой... хотя бы один раз. Этот номер доставляется информацией с правой стороны.

Таким образом, код выше должен быть отмечен как вызванный, а не быть серым: -)

Кто-нибудь может это объяснить? Почему это происходит?

4b9b3361

Ответ 1

ЭТО РАБОТАЕТ.

  • Так как Apple выпустила ключевое слово @testable, чтобы импортировать проект в тестовую цель, вам больше не нужно добавлять файлы в оба целевых объекта:

введите описание изображения здесь

  1. Так что просто удалите каждый файл из тестовой цели:

введите описание изображения здесь

  1. Если вам нужен доступ к вашему файлу из тестовой цели, просто импортируйте свою цель, используя: @testable import MyApp

введите описание изображения здесь

  1. Сделайте это для каждого файла в вашем проекте.

Тогда покрытие кода будет работать нормально.

Подробнее из 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 вашего проекта для обеих целей.

Вручную выбирать и удалять тестовую цель для файлов работает для меня.