Сбор тестового покрытия
Тестовое покрытие можно собирать как на компьютере разработчика, так и на Platform SDK. Приведённые в данной инструкции команды можно использовать для обеих систем.
Требования и зависимости
Для сбора тестового покрытия на компьютере разработчика необходимы инструменты:
- gcc/g++;
- lcov (обёртка над gcov);
- genhtml;
- Аврора SDK.
Команды в данной инструкции приводятся для Unix-совместимого терминала. В Linux и macOS можно использовать стандартный терминал, в Windows необходимо использовать Git Bash.
Platform SDK уже содержит gcc, lcov и genhtml, поэтому дополнительные зависимости при работе на нём устанавливать не требуется.
lcov(gcov) работает с файлами .gcno и .gcda, которые должны находиться в одном каталоге, из которого доступны по относительным или абсолютным путям исходники приложения. Файлы .gcno генерируются на этапе компиляции и оказываются на хост-машине в каталоге с объектными файлами. Файлы .gcda появляются на этапе запуска в виртуальной машине или на реальном устройстве, поэтому их надо переместить в каталог с файлами .gcno.
Предварительные настройки эмулятора
Для сбора тестового покрытия с помощью эмулятора необходимо сделать доступным на запись каталог /run/media/defaultuser/sdk, чтобы приложение смогло поместить в него файлы .gcda. По умолчанию каталог монтируется в режиме только для чтения.
Для этого в VirtualBox надо выбрать виртуальную машину AuroraOS-<версия_эмулятора>-base, нажать кнопку Настроить, выбрать пункт Общие папки (1), выбрать папку media (2), нажать кнопку изменения настроек справа (3), снять галочку Только для чтения и сохранить настройки, нажав везде ОК. Данное действие достаточно проделать один раз.
Сбор тестового покрытия
Для сбора тестового покрытия необходимо выполнить следующие шаги:
-
В Аврора IDE открыть проект, для которого измеряется тестовое покрытие, и перейти в настройки проекта (1).
-
Выбрать пункт Сборка (2) для нужной цели. Комплекты armv7hl и aarch64 используются для мобильных устройств, x86_64 — для эмулятора.
-
Перейти в раздел Сборка, этапы (3), для этапа qmake нажать на кнопку Подробнее (4) и в развернувшейся области в поле Дополнительные параметры (5) ввести параметры, в зависимости от выбранной цели:
-
Для эмулятора:
QMAKE_CXXFLAGS_DEBUG+=--coverage -fprofile-dir=/run/media/defaultuser/sdk QMAKE_LIBS+=-lgcov
-
Для реального устройства:
QMAKE_CXXFLAGS_DEBUG+=--coverage -fprofile-dir=/home/defaultuser/<название_каталога> QMAKE_LIBS+=-lgcov
где <название_каталога> — это название каталога в домашней директории пользователя устройства с правами на запись.
Для успешной сборки и генерации файлов тестового покрытия необходимо не только подать компилятору опции
-fprofile-arcs -ftest-coverage
, но и опцию-lgcov
для линковки. Опция--coverage
— синоним опций-fprofile-arcs -ftest-coverage
для фазы компиляции и-lgcov
для фазы линковки. Поскольку в IDE эти фазы выполняются раздельно, то опцию-lgcov
нужно передавать для линковки явно. Опцию-lgcov
нужно передать черезQMAKE_LIBS
, чтобы она не попала в начало командной строки впереди объектных файлов приложения, вызвав ошибку undefined reference to '_gcov...'. -
-
Скомпилировать приложение, нажав кнопку сборки в нижнем левом меню. Убедиться в том, что нет ошибок компиляции и линковки, а также, в том, что в директории
build-<название_приложения>-<цель>-Debug
появились файлы .gcno. Если файлы .gcno не появились, то нужно очистить сборку и пересобрать проект. -
Перейти в директорию
build-<название_приложения>-<цель>-Debug>
, в которой находится сборка проекта, и создать базовое покрытие с помощью команды:lcov -c -i -d . -o base.info
Результатом базового покрытия станут данные тестового покрытия, содержащие нулевое покрытие для каждой строчки в проекте.
Если все исходные файлы проекта участвуют в компиляции, то этот шаг и шаг 9 необязательны.
На данном этапе появление ошибок, похожих на
version 'A83A', prefer 'A94*'
, означает, что в сборочном окружении и на компьютере разработчика установлены разные версии gcc/g++ и gcov (версии в сообщении ошибки могут отличаться от указанных в примере). Эта ошибка может мешать корректному созданию файла с информацией о покрытии.Чтобы устранить ошибку, требуется установить на компьютер разработчика gcc/g++ и gcov такой же версии, как на сборочном окружении. Достаточно, чтобы совпадали старшие (мажорные) номера версий. Если будут отличаться младшие (минорные) номера версий, то ошибка также может появляться, но она не будет влиять на создание файла с информацией о покрытии. Также потребуется явно указать инструменту
lcov
путь к gcov необходимой версии следующим образом:lcov -c -i -d . -o base.info --gcov-tool /usr/bin/gcov-8
где gcov-8 — это путь к gcov определённой версии.
-
Запустить сборку и установку тестов на эмулятор или устройство.
-
После того, как тесты выполнятся, надо извлечь получившиеся файлы .gcda. Если приложение запускалось на реальном устройстве, то .gcda-файлы будут храниться на устройстве в указанной на шаге 3 директории /home/defaultuser/<название_каталога>. Остаётся только переместить эти .gcda-файлы в каталог с .gcno-файлами. Это можно сделать либо вручную, либо с помощью утилиты
scp
:scp defaultuser@<ip-адрес-устройства-в-сети>:/home/defaultuser/<название_каталога>/*.gcda <путь_к_каталогу_build-<название_приложения>-<цель>-Debug>
Если приложение запускалось на виртуальной машине, и эмулятор был предварительно настроен, как описано в разделе Предварительные настройки эмулятора, то файлы будут скопированы на хост-машину в каталог AuroraOS/emulator/media, так как этот каталог в виртуальной машине монтируется в /run/media/defaultuser/sdk гостевой системы. Остаётся только переместить .gcda-файлы в каталог к .gcno-файлам:
mv ~/AuroraOS/emulator/media/*.gcda <путь_к_каталогу_build-<название_приложения>-<цель>-Debug>
Если по каким-либо причинам не удаётся воспользоваться каталогом /run/media/defaultuser/sdk в гостевой системе, то следует попробовать указать любой другой путь к каталогу, доступному на запись для пользователя defaultuser. И после завершения теста перенести получившиеся .gcda-файлы с помощью команды
scp
:scp -P 2223 -i ~/AuroraOS/vmshare/ssh/private_keys/sdk defaultuser@localhost:<указанный каталог>/*.gcda <путь_к_каталогу_build-<название_приложения>-<цель>-Debug>
-
Запустить
lcov
. Например, в каталоге сборки проекта build-<название_приложения>-<цель>-Debug команда будет выглядеть следующим образом:lcov -c -d . -o test.info
На шаге 5 описаны действия, которые нужно выполнить, если появились ошибки, похожие на
version 'A83A', prefer 'A94*'
. -
Скомбинировать снимки данных до теста и после:
lcov -a base.info -a test.info -o total.info
Если был пропущен шаг 5, то этот шаг тоже следует пропустить.
-
Отфильтровать ненужные директории и исходные (заголовочные) файлы.
lcov -r total.info '/usr/include/*' '/srv/mer/*' -o filtered.info
-
Создать HTML-отчёт.
genhtml --ignore-errors source filtered.info --legend --titleApplication Template -o ApplicationTemplate
Заголовок (аргумент
--title
) и выходной каталог (аргумент-o
) можно выбрать произвольно. В выходном каталоге появитсяindex.html
, с которого можно начинать анализ отчёта.