Отчет о покрытии кода iOS содержит файлы, которых там быть не должно

У меня есть проект Xcode с двумя целями: основная цель, в которой находится исходный код (назовем ее CoolApp), и тестовая цель для модульных тестов (назовем ее CoolAppTests). У меня также есть хук фиксации Git, который гарантирует, что я не смогу зафиксировать изменение, если общее покрытие строки проекта упадет ниже определенного процента.

Проблема в том, что отчет о покрытии содержит не только файлы в CoolApp, но и файлы в CoolAppTests. В результате, когда я добавляю новый тестовый файл, общее покрытие строки проекта может на самом деле уменьшиться, что делает коммит-хук бесполезным.

Чтобы создать отчет о покрытии, я выполняю следующие шаги:

xcodebuild test \
   -project "CoolApp.xcodeproj" \
   -scheme "CoolAppTests" \
   -destination "platform=iOS Simulator,name=iPhone 6,OS=10.0" \
   -configuration Debug \
   -enableCodeCoverage YES

Затем я получаю DerivedData для CoolAppTests, просматривая каталог TEMP_ROOT в настройках сборки (xcodebuild -target CoolAppTests -showBuildSettings). Оттуда я получаю /CodeCoverage/Coverage.profdata и двоичный файл, расположенный в /CodeCoverage/Products/Debug-iphonesimulator/CoolAppTests.xctest/CoolAppTests.

PROFDATA=.../CodeCoverage/Coverage.profdata
BINARY=.../CodeCoverage/Products/Debug-iphonesimulator/CoolAppTests.xctest/CoolAppTests

Наконец, я генерирую отчет и фиксирую его вывод:

xcrun llvm-cov report -instr-profile "${PROFDATA}" "${BINARY}"

В этот момент, как указывалось ранее, отчет содержит файлы как из CoolApp, так и из CoolAppTests.

Есть ли способ отфильтровать то, что входит в отчет, чтобы он содержал только файлы моей основной цели — CoolApp — и не файлы из моей тестовой цели CoolAppTests?


person RuslanD    schedule 04.10.2016    source источник


Ответы (1)


Интересно. Мне удалось показать отчет о моей структуре, выполнив:

xcrun llvm-cov report -instr-profile Coverage.profdata 
    Products/Debug-iphonesimulator/StoryTeller.framework/StoryTeller

Заметьте, я указал путь к фреймворку. Это показало мне только классы фреймворка. Чтобы отобразить покрытие тестов, мне пришлось использовать это:

xcrun llvm-cov report -instr-profile Coverage.profdata
    Products/Debug-iphonesimulator/StoryTellerTests.xctest/StoryTellerTests 

Чтобы дважды проверить это, я вошел в производные данные для приложения Swift, над которым я работаю, и выполнил это:

xcrun llvm-cov report -instr-profile Coverage.profdata 
    Products/Debug-iphonesimulator/xxxxxx.app/xxxxxx

Опять же, мне показали только покрытие классов в приложении.

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

person drekka    schedule 07.10.2016
comment
Несколько вопросов: 1) включено ли у вас покрытие для вашей целевой платформы, вашей тестовой цели или и того, и другого; 2) будет ли это работать, если вывод сборки представляет собой статическую библиотеку, а не фреймворк/приложение? - person RuslanD; 07.10.2016
comment
Я включил поддержку покрытия на всех таргетах (думаю, это по умолчанию) и собираю данные о покрытии в тестовых настройках схемы. Что касается статической библиотеки. Не уверен. Но я бы предположил, что это будет то же самое. Включены ли классы вашего приложения в фазу компиляции источников? Если это так, удалите их и повторите попытку. - person drekka; 07.10.2016