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

XCode 5.1 Unit Test Анализ покрытия не работает с файлами с использованием блоков

Сегодня мне было поручено добавить unit test анализ покрытия на нашу базу кода. Сегодня также вышел iOS 7.1, выпущенный вместе с XCode 5.1. Из примечаний к выпуску:

Инструмент gcov для тестирования покрытия кода был переопределен. Новая версия использует инструмент llvm-cov из проекта LLVM. Он функционально эквивалентен старой версии для всех значимых функций. Расположение gcov внутри Xcode также перемещено, используйте xcrun для его вызова. Если вы обнаружили проблемы, сообщите об ошибках. Для этой версии вы все равно можете использовать старую версию gcov из GCC, доступную как gcov-4.2. 11919694 обновлено

Я понял это только после нескольких учебных : сообщений, правильно настроив мою среду - генерируя файлы .gcda/.gcno в папках сборки симулятора при тестировании - и имея инструменты генерации отчетов здесь попробуйте проанализировать их в отчете. (это файл. /getcov script, который собирает переменные среды для перехода к сценариям lcov-1.10 для создания отчета)

Первым препятствием было то, что новая связанная программа gcov не поддерживает аргумент -v, чтобы получить версию, которая является первым шагом инициализации lcov. Как уже не было стартера, но, прочитав примечания к выпуску выше, я модифицировал lcov script, чтобы использовать старую версию gcov-4.2 и получил это решение.

Тем не менее, lcov ошибочно обнаружил ошибки в обработке моих файлов данных о покрытии. Это сгенерировало отчет, возможно, первые 10 или около того файлов в алфавитном порядке в моем проекте. Не особенно полезно. Выход ошибки был минимальным и бесполезным:

geninfo: ERROR: GCOV не удалось (build_artifacts)/(class_that_errored).gcda!

Я изменил lcov script, чтобы напечатать ошибку, которую он получал (что только дало 11, к сожалению, не удалось найти ссылку в коде gcov (-io).c) и продолжить работу отказавшись, поэтому в отчете оставалось гораздо больше файлов, но, вероятно, 85% моих исходных файлов были ошибочными, как указано выше.

Единственный шаблон, который я мог различить между файлами, которые были успешно завершены в отчете, и те, которые выкидывали ошибку, заключались в том, что любой файл, который использовал объявление строки в строке, не удался. Ни один из файлов, передавших используемые блоки каким-либо образом, и все файлы, которые я проверил, не удались, содержат блоки. Странно.

Затем я понял, что могу открыть отдельные .gcda файлы в CoverStory, включая те, которые были ошибочны в lcov script. В окне сообщения ниже отчета о охвате все файлы с ошибкой имели предупредительные сообщения:

(class_that_errored).gcno: нет строк для '__copy_helper_block _'

(class_that_errored).gcno: нет строк для '__destroy_helper_block _'

Моя лучшая гипотеза на этом этапе заключается в том, что новый XCode 5.1 генерирует файлы .gcda, которые старая программа gcov-4.2 не имеет возможности обрабатывать объявления блоков.

Но я исчерпал все, что я могу придумать, чтобы попытаться, поэтому я здесь, чтобы спросить, есть ли у кого-то знания, которые я пропустил, или есть идеи для дальнейшего отладки. Или, если кто-то успешно оценивает охват тестирования, так как сегодня XCode 5.1 обновляется с новым gcov, я бы с удовольствием узнал о любых изменениях, которые вам пришлось внести.

4b9b3361

Ответ 1

Проблема заключается в LCOV 1.10 geninfo script. Он проверяет текущую версию gcov. Он делает это, анализируя строку версии. Поскольку gcov теперь указывает на llvm-cov, строка версии анализируется некорректно.

Решение состоит в изменении подпрограммы geninfo s get_gcov_version(). В строке 1868 измените -v на --version. Затем замените строку 1874 на:

if ($version_string =~ m/LLVM/)
{
    info("Found llvm-cov\n");
    $result = 0x40201;
}
elsif ($version_string =~ /(\d+)\.(\d+)(\.(\d+))?/)

 

Измененная подпрограмма должна выглядеть так:

sub get_gcov_version()
{
    local *HANDLE;
    my $version_string;
    my $result;

    open(GCOV_PIPE, "-|", "$gcov_tool --version")
        or die("ERROR: cannot retrieve gcov version!\n");
    $version_string = <GCOV_PIPE>;
    close(GCOV_PIPE);

    $result = 0;
    if ($version_string =~ m/LLVM/)
    {
        info("Found llvm-cov\n");
        $result = 0x40201;
    }
    elsif ($version_string =~ /(\d+)\.(\d+)(\.(\d+))?/)
    {
        if (defined($4))
        {
            info("Found gcov version: $1.$2.$4\n");
            $result = $1 << 16 | $2 << 8 | $4;
        }
        else
        {
            info("Found gcov version: $1.$2\n");
            $result = $1 << 16 | $2 << 8;
        }
    }
    return ($result, $version_string);
}

 

ПРИМЕЧАНИЕ. Убедитесь, что --gcov-tool не установлен на gcov-4.2.

Ответ 2

Вместо изменения geninfo я создал llvm-cov-wrapper script и использовал параметр командной строки lcov --gcov-tool:

#!/bin/bash
# llvm-cov wrapper to make it behave more like gcov

if [ "$1" = "-v" ]; then
    echo "llvm-cov-wrapper 4.2.1"
    exit 0
else
    /usr/bin/gcov $*
fi

Ответ 3

На самом деле я заметил, что lcov вызывает gcov с опцией -b, и gcov-4.2 будет аварийно отключен по этой опции (ошибка сегментации сегментации). Если я удалю параметр -b из getinfo, то даже если он все еще показывает некоторую информацию об ошибке, файл gcov все еще может быть сгенерирован.

Вероятно, поэтому coverstory все еще может давать информацию о покрытии. Поэтому я предполагаю, что обходным путем является удаление опции -b из lcov. А также, как вы предположили, проигнорируйте ошибку в getinfo

Ответ 4

Для кого-то нового в этой теме обратите внимание, что lcov-1.11 отсутствует. Это устраняет проблему с gcov -v совместимостью. Тем не менее, я использую XCode 6.1 и все еще получаю ошибки в некоторых файлах.

geninfo: WARNING: /Users/XXX/MyFile.gcno: found unrecognized record format - skipping

Обратите внимание, что вы можете добавить --ignore-errors graph, чтобы пропустить эти ошибки, но проблема не решена.