#cmake #clang #code-coverage
#cmake #clang #код-покрытие
Вопрос:
Я работаю над проектом на C с CMake clang. Теперь я хотел бы интегрировать покрытие на основе исходного кода с моими модульными тестами. При компиляции с правильными флагами необработанные данные покрытия помещаются в файлы в соответствии с шаблоном, заданным переменной LLVM_PROFILE_FILE
среды. Поскольку я использую catch2 в качестве тестовой среды, я вызываю:
catch_discover_tests(
my_test
PROPERTIES ENVIRONMENT LLVM_PROFILE_FILE=coverage/my_test_%p.profraw
)
При запуске test
цели это приведет к размещению .profraw
каждого тестового процесса в coverage
каталоге. Я также добавил пользовательскую coverage
цель, которая объединяет эти файлы в .profdata
файл:
add_custom_command(
OUTPUT coverage/my_test.profdata
COMMAND llvm-profdata merge -sparse coverage/*.profraw -o coverage/my_test.profdata
)
add_custom_target(coverage DEPENDS coverage/my_test.profdata)
Это работает достаточно хорошо. Однако, если я теперь test
снова запущу цель несколько раз и забуду очистить coverage
каталог между ними, запуск coverage
цели объединит данные из нескольких тестовых запусков. Это не то, что я хочу, поэтому я хотел бы убедиться, что coverage
каталог всегда удаляется перед запуском тестов. Но я не уверен, как это сделать, я пробовал:
add_custom_target(
clean_coverage_dir
COMMAND ${CMAKE_COMMAND} -E rm -rf coverage
)
add_dependencies(test clean_coverage_dir)
После catch_discover_tests
, но это приводит к:
Cannot add target-level dependencies to non-existent target "test".
Что я могу сделать? Может быть, мне следует использовать совсем другой подход?
Комментарии:
1. Возможно, стоит взглянуть на тестовые приспособления: cmake.org/cmake/help/latest/prop_test/FIXTURES_SETUP.html
2. @fabian Я не слышал об этом раньше, я изучу это, спасибо.
Ответ №1:
Если кому-то интересно, я нашел своего рода очевидное решение:
add_custom_target(
test_coverage
COMMAND ${CMAKE_COMMAND} -E rm -rf coverage amp;amp;
${CMAKE_CTEST_COMMAND} --force-new-ctest-process amp;amp;
llvm-profdata merge -sparse coverage/*.profraw -o coverage/my_test.profdata
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)