Что такое покрытие кода и как обеспечивается?cplus-15

Что такое покрытие кода?

Покрытие кода (code coverage) — это метрика, показывающая процент исходного кода, который был выполнен во время тестирования. Она помогает оценить эффективность тестов и выявить непроверенные участки программы.

Основные типы покрытия:

  1. Покрытие функций - % вызванных функций
  2. Покрытие строк - % выполненных строк кода
  3. Покрытие ветвей - % пройденных условных переходов
  4. Покрытие условий - % комбинаций условий в логических выражениях

Как измеряется покрытие кода?

Инструменты для C/C++

  1. GCC/G++ (встроенная поддержка через gcov):
g++ -fprofile-arcs -ftest-coverage program.cpp
./program
gcov program.cpp
  1. LLVM (clang с инструментацией):
clang -fprofile-instr-generate -fcoverage-mapping program.cpp
./program
llvm-profdata merge -sparse default.profraw -o default.profdata
llvm-cov show ./program -instr-profile=default.profdata
  1. Коммерческие инструменты:
    • Testwell CTC++
    • BullseyeCoverage
    • Parasoft C/C++test

Как обеспечить высокое покрытие кода?

1. Написание юнит-тестов

Пример с Google Test:

#include <gtest/gtest.h>

int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

TEST(FactorialTest, HandlesZeroInput) {
    EXPECT_EQ(1, factorial(0));
}

TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(120, factorial(5));
}

2. Интеграционное тестирование

  • Тестирование взаимодействия модулей
  • Использование mock-объектов для изоляции компонентов

3. Регрессионное тестирование

  • Автоматизированные тесты после каждого изменения кода
  • Системы непрерывной интеграции (CI/CD)

4. Параметризованные тесты

TEST_P(ParametrizedTest, TestCases) {
    int value = GetParam();
    ASSERT_TRUE(value > 0);
}

INSTANTIATE_TEST_SUITE_P(
    PositiveValues,
    ParametrizedTest,
    testing::Values(1, 2, 3, 5, 10)
);

Практические рекомендации

  1. Целевые показатели:

    • 80-90% для критически важных систем
    • 70-80% для обычных проектов
    • 100% покрытие не всегда целесообразно
  2. Анализ результатов:

    • Фокус на сложную логику (условия, ветвления)
    • Игнорирование тривиального кода (простыx геттеров)
  3. Интеграция в процесс разработки:

    • Проверка покрытия перед мерджем веток
    • Визуализация в CI-системах (Jenkins, GitLab CI)

Ограничения метрики покрытия

  • 100% покрытие ≠ отсутствие багов
  • Не учитывает качество проверок (только факт выполнения)
  • Может стимулировать "натягивание" тестов

Резюмируем: покрытие кода — важная метрика качества тестирования, которая требует комплексного подхода к инструментам и методологии. Оптимальное значение зависит от проекта, а сама метрика должна дополняться другими видами тестирования.