Покрытие кода
Мы работаем над тем, чтобы больше исходного кода MariaDB было покрыто нашим набором тестов mysql-test-run (MTR). Это непрерывная (и медленная) задача, так как все еще много старого кода с не очень хорошим покрытием.
Цели для нового кода
Для нового кода в MariaDB мы ставим гораздо более высокие цели:
Цели следующие:
- Все новые строки кода должны, в идеале, проверяться с помощью MTR.
- Код, который нельзя разумно протестировать с помощью MTR, должен быть протестирован другим инструментом, и эти строки кода должны быть помечены комментарием /* purecov: tested */.
- В этом случае инструмент, используемый для тестирования, должен быть описан в записи журнала работ по этому коду или в сообщении об изменении.
- Код, который нельзя разумно протестировать (например, условия ошибок), должен быть помечен комментарием '/* purecov: inspected */', чтобы проверяющий код мог легко обнаружить этот код.
- Код, который, как предполагается, является мертвым кодом, должен содержать 'DBUG_ASSERT(0)' или быть помечен комментарием '/* purecov: deadcode */', чтобы мы имели возможность заметить, если код когда-либо выполняется.
Причина, по которой мы используем 'purecov' для маркировки строк, связана с инструментом purecov, который мы изначально использовали для измерения покрытия кода в ранние годы MySQL.
Маркеры
Рекомендуемые маркеры:
/* purecov: tested */
- Для строк кода, которые тестируются чем-то другим, чем mysql-test-run:
/* purecov: inspected */
- Для строк кода, которые трудно протестировать, но для которых строка была прочитана несколько раз, чтобы убедиться в ее корректности. Проверяющий код также должен внимательно проверить эти строки, так как они не были должным образом протестированы.
/* purecov: deadcode */
- Для строк кода, которые, как предполагается, никогда не будут вызываться. Наличие этого маркера позволяет генерировать предупреждение во время проверки покрытия кода mysql-test-run, если эта строка выполняется.
Комментарий должен быть размещен в строке/строках, которые затронуты.
Для блоков кода, больших, чем 1 строка, можно использовать синтаксис блока:
/* purecov: begin tested */ .... /* purecov: end */
Запуск mysql-test-run с gcov
Предварительные условия
- Сначала убедитесь, что установлен gcov 4.9. Более старые версии библиотеки gocv (lgcov) не могут обрабатывать одновременный запуск нескольких экземпляров программы. Это приводит к тому, что сгенерированные файлы .gov не содержат все выполненные строки при запуске mysql-test-run с параметром --parallel или при запуске тестов, которые запускают несколько серверов mysqld, таких как тесты репликации или паутины.
- Скомпилируйте MariaDB с BUILD/compile-pentium64-gcov (если на вашем компьютере нет процессора Pentium, измените этот скрипт или просто смиритесь со спецификой Pentium).
Запуск mysql-test-run
Чтобы увидеть уровень покрытия в текущем наборе тестов, выполните следующие действия:
- В каталоге mysql-test выполните эту команду:
./mysql-test-run -gcov - Чтобы увидеть, какие строки еще не покрыты, см.
source_file_name.gcovв дереве исходного кода. В MariaDB 10.1 или ниже он находится в каталоге CMakeFiles, где хранятся объектные файлы. В MariaDB 10.2 он хранится вместе с исходными файлами. - Внимательно подумайте над тестовым случаем, который покроет эти строки, которые не протестированы, и напишите его.
Инструменты
- Вы можете использовать инструмент code-coverage-with-dgcov/dgcov для проверки покрытия для нового кода. Он специально разработан и поддерживается для MariaDB.
- Для измерения покрытия кода также используется инструмент lcov.
Покрытие кода в buildbot
buildbot, система сборки MariaDB, выполняет автоматическое тестирование покрытия кода для каждого изменения.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/code-coverage/