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

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

В некоторых файлах все коды покрыты примерами модульного тестирования, но по-прежнему показано 3% покрытия кода.

Например:

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

Но...

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

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

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


person Sudhir Kumar    schedule 22.06.2015    source источник
comment
Точно такой же вопрос от меня :) Я охватил целый класс, но покрытие кода затенило мои методы, которые были вызваны, действительно, они не должны быть затенены. (Только если серым цветом означает код, который не вызывался во время тестов). Ждет ответа...   -  person Bartłomiej Semańczyk    schedule 29.06.2015
comment
Я думаю, что он все еще не работает (по крайней мере, для проектов iOS). У меня был тестовый проект для OSX, и там он работает, как и ожидалось, но для настраиваемого кода iOS, который срабатывает, он не выделяется как таковой.   -  person 0x416e746f6e    schedule 07.07.2015


Ответы (5)


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

  1. Поскольку Apple выпустила ключевое слово @testable для импорта вашего проекта в тестовую цель, вам больше не нужно добавлять файлы в обе цели:

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

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

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

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

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

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

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

Узнайте больше на Swift 2 + Xcode 7: доступ к модульному тестированию стал проще!! !!

Если вам нужно знать, как работать с покрытием кода, прочитайте Как использовать код покрытие в Xcode 7?

Как упоминал ранее @Gerd Castan: «Итак, мне кажется, что проверенный метод показывает покрытие 0, когда существует хотя бы одна цель, где этот метод не проверен».

Решение простое. Не позволяйте компилятору думать, что этот файл включен более чем в одну цель, вместо этого импортируйте ваш модуль, используя ключевое слово @testable.

person Bartłomiej Semańczyk    schedule 01.08.2015
comment
ЭТО НЕ РАБОТАЕТ. Использование импорта @testable — хорошая идея, но она работает только в простейшем частном случае для тех, кто решил скомпилировать в тестовую цель. Есть много веских причин для компиляции некоторых классов в несколько (не тестовых) целей (например, основное приложение + расширение(я) или бесплатное приложение + платное приложение). И для этих распространенных случаев ваша идея не работает. Как вы видите в исходном коде моего ответа, я использовал импорт @testable, и все же редактор исходного кода не показывает покрытия. - person Gerd Castan; 02.08.2015
comment
Потому что ваши файлы (я полагаю) предназначены как для приложения, так и для теста, поскольку они не должны. Apple выпустила ключевое слово @testable, чтобы избежать таргетинга файлов для обоих. - person Bartłomiej Semańczyk; 02.08.2015
comment
Неа. Я не компилирую классы приложений в тестовую цель. - person Gerd Castan; 02.08.2015
comment
Удалите тестовую цель и создайте ее снова. Один раз мне было хорошо. - person Bartłomiej Semańczyk; 02.08.2015
comment
Я создал дополнительный совершенно новый проект, чтобы проверить свой ответ, прежде чем я его написал. Вы компилируете более чем в одну цель? - person Gerd Castan; 02.08.2015
comment
Нет, я компилирую его ровно в одну цель, цель моего приложения. Если вы компилируете конкретный файл для более чем одной цели, то вы были правы, он должен использоваться в обеих целях, чтобы пометить покрытие этого файла как выполненное. - person Bartłomiej Semańczyk; 02.08.2015
comment
согласен: не компилировать в тестовую цель и тестировать каждую оставшуюся цель. - person Gerd Castan; 02.08.2015

Я думаю, что выяснил, что делает покрытие XCTest, и это имеет некоторый смысл:

Моя установка:

class1 скомпилирован в target1

class2 скомпилирован в target1 и в target2

Испытательная установка:

import XCTest
@testable import target1

class MyTests: XCTestCase {
    func testSomething() {
        someMethodFromClass1()
        someMethodFromClass2()
    }
}

Я обнаружил, что class1 (скомпилированный в target1) показывает тестовое покрытие, а class2 (скомпилированный в target1 и target2) не показывает никакого тестового покрытия.

Поэтому мне кажется, что проверенный метод показывает покрытие 0, когда существует хотя бы одна цель, где этот метод не проверен.

И это имеет большой смысл, потому что тестирование метода в целевом объекте ничего не говорит о том, как он ведет себя в другом целевом объекте.

Apple хочет, чтобы мы проверили все цели.

Обновление Еще один намек в поддержку этой теории:

перейти к навигатору отчетов

навигатор отчетов

и нажмите на покрытие.

Если у вас более одной цели, вы увидите, что ваши файлы сгруппированы по цели.

И если у вас есть один файл в двух целях, вы видите свой файл дважды.

Если у вас есть один файл в обеих целях, покрытие кода этого одного файла показано для обеих целей. И (по крайней мере, в моих проектах) один файл имеет разные синие линии в каждой цели:

охват в цели 1:

цель 1

охват одного и того же файла в том же проекте в том же тестовом прогоне в цели 2:

цель 2

Если вы посмотрите на свое тестовое покрытие в редакторе исходного кода, Apple должна решить, какое покрытие она вам покажет. Я думаю, что показать цель с наименьшим охватом — это лучшее, что Apple может сделать в редакторе исходного кода.

простое исправление для особого случая:

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

Во всех остальных случаях вы должны протестировать каждую цель.

person Gerd Castan    schedule 22.07.2015

Я проверил эту тему на форумах разработчиков Apple и, прочитав различные сообщения, думаю, нашел решение.

Для того чтобы вещь заработала необходимо:

  1. Удалите все исходные файлы вашего приложения из тестовой цели
  2. В исходниках юнит-тестов поместите @testable import <NameOfYourModule>
  3. Перестроить и повторно запустить тесты

Я проверил это с моим текущим проектом, и результаты намного лучше.

Оригинальный рецепт решения можно найти по адресу: http://natashatherobot.com/swift-2-xcode-7-unit-testing-access/

Также кажется, что функциональность немного сырая, поэтому возможны ошибки, и Apple предлагает отправлять отчеты об ошибках, когда что-то не работает должным образом:

Я лично видел результаты покрытия кода для некоторых очень крупных проектов. Сейчас поддержка работает лучше всего для приложений и фреймворков. Если это то, что вы тестируете, было бы лучше, если бы вы могли отправить отчет об ошибке по адресу https://bugreport.apple.com, чтобы мы могли исследовать ваши конкретные обстоятельства. Если на то пошло, отчет об ошибке был бы полезен независимо от типа вашего проекта. Если есть возможность, то лучше собственно в проекте с отчетом. Если вы не можете этого сделать, опишите как можно подробнее его настройку. Фотографии хорошие.

Исходная ветка: https://forums.developer.apple.com/message/9733#9733< /а>

person 0x416e746f6e    schedule 07.07.2015

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

Или материал покрытия Xcode может быть нарушен, но трудно сказать, если вы не предоставите подробную информацию о том, какое покрытие вы ожидаете от проверки.

person Dietr1ch    schedule 05.07.2015
comment
Все функции и все инструкции в файле functions. Используя функцию покрытия, когда я запускаю тесты, в коде строки, которые использовались, выделены серым цветом. Но это не работает в хорошем смысле. Слишком маленькие линии выделены серым цветом. Они должны быть. - person Bartłomiej Semańczyk; 05.07.2015

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

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

person Rakesh Yembaram    schedule 11.12.2016