Почему gcov не сообщает о каких-либо линиях, охватываемых моими модульными тестами?
Я использую Xcode 3.2 на 10.6, с отправленной версией gcov и компилятором GCC по умолчанию (обе версии 4.2.1). Я создал зависимый пакет Cocoa unit test, который был добавлен в мое приложение, и последовали за документацией Apple по настройке конфигурации сборки gcov-instrumented - на основе конфигурации Debug, которая не имеет оптимизаций компилятора.
Когда я создаю тестовый комплект с этой настройкой "Gcov-instrumented", приложение запускается и тесты вводятся и запускаются. Также файлы статистики покрытия создаются по адресу:
build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcda
build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcno
Пока все хорошо. Я знаю, что тесты действительно выполняются, потому что, если я вставляю отказы, тогда тестовый набор выходит из строя, как ожидалось. К сожалению, gcov сообщает, что никакие строки объектов не были покрыты тестами! Каждая строка отображается как 0. Я искал здесь и в архивах списков рассылки Apple, и не могу найти никого с аналогичной проблемой. Я ожидаю, что у меня что-то не хватает, но что это?
Ответы
Ответ 1
Я сталкивался с этой проблемой с перерывами. Я наткнулся на хорошую удачу, когда он был "главным образом работает" в моем основном проекте. В основном работая, я имею в виду, что я смог получить освещение, чтобы показать, но с немного большей болью, чем 10,5. Например, я должен был агрессивно удалить файлы покрытия и перестроить, чтобы получить какие-либо обновления. Даже в моем "едва работающем" состоянии компилятор/среда выполнения не желает перезаписывать существующий файл данных покрытия.
Я думаю, что снова наткнулся на рабочий сценарий. Voodoo наверняка и менее идеален:
- Убедитесь, что SDK равен 10.6.
- Убедитесь, что для развертывания установлено значение gcc 4.0 (!).
- Сделайте полную очистку проекта.
- Перестроить.
Получают ли это ваши ожидаемые данные о покрытии?
Конечно, я ожидал бы, что сможет генерировать файлы покрытия, которые работают с использованием gcc 4.2 или одного из компиляторов LLVM, но на данный момент это кажется мне немного менее искалеченным, чем раньше.
Еще одна подсказка: когда я наблюдаю данные покрытия (используя Cover Story), я получаю предупреждения вроде:
/BUILDRESULTS/MarsEdit.build/Code Coverage/MarsEditDataModelTests.build/Objects-normal/i386/MEDataItem.gcno: версия '400A', предпочтительно '402 *'
Но информация о покрытии все еще представлена. Таким образом, кажется, что он отклоняется от старой версии формата покрытия, но если я использую новый компилятор (4.2), который предположительно сгенерирует файлы с более новым форматом .gcno
, проблема с охватом 0% меня поразит, как и у Грэма.
Ответ 2
В Xcode 4.6 отчеты по охвату, похоже, работают. Включите "Генерировать файлы контрольных покрытий" и "Поток инструментальных средств" для целевой цели приложения, запустите тесты, а затем укажите инструмент охвата на выходе. Это в ~/Library/Developer/Xcode/Derived Data/<Project>-<hash>/Build/Intermediates/<Target>.build/Debug-iphonesimulator/<Target>.build
; открытие этой папки в CoverStory показывает мне результаты, которые я ожидал.
Этот репозиторий GitHub содержит сценарии, которые могут автоматически открывать вывод и получать lcov для его визуализации; Пока я доволен CoverStory.
Ответ 3
Вы можете получить покрытие кода, работающее с gcc 4.2.1. Подробности здесь:
SnowLeopardGCov
Ответ 4
Я пытался получить покрытие кода для симулятора iPhone и всегда получаю покрытие в размере 0%. Ниже приведены сведения о конфигурации и шаги, которые я пробовал.
Конфигурация
Xcode 3.2.5/iOS 4.1 и iOS 4.2/Mac 10.6/GCC 4.2
заявка
UICatalog
Ссылки
http://www.cubiclemuses.com/cm/articles/2009/05/14/coverstory-on-the-iphone/
http://developer.apple.com/library/mac/#qa/qa2007/qa1514.html
Шаги
- Включить "Сгенерировать файлы тестового покрытия"
- Включить "Прикладной программный поток"
- Добавить "-lgcov" в "Другие флаги компоновщика"
- Флаг UIApplicationExitsOnSuspend в Info.plist имеет значение true
Результат
У меня есть файлы .gcda, но покрытие всегда показывает 0%.
Настройки попытались
- Изменение GCC до 4.0 и 4.2. Когда я пытаюсь изменить GCC на 4.0, я получаю 26 ошибок сборки.
-
Установите переменные среды:
const char *prefix = "GCOV_PREFIX";
const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app Documents directory
const char *prefixStrip = "GCOV_PREFIX_STRIP";
const char *prefixStripValue = "1";
setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files.
setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.)
- Оптимизация GCC установлена на None (-O0) и снят флажок precompiled prefix header file.
Ответ 5
Я получал 0-покрытие, когда *.gcno файлы для статической библиотеки были перезаписаны для разделяемой библиотеки.