Анализ покрытия кода с использованием CodeCoverage.cmake с несколькими целями

У меня есть модульный тест в моем проекте, реализованный с использованием Платформа для тестирования модулей Boost и организованный в несколько модулей, а именно:

#define BOOST_TEST_MODULE Connection_test

#ifndef BOOST_TEST_DYN_LINK
#define BOOST_TEST_DYN_LINK
#endif

#ifndef BOOST_TEST_NO_MAIN
#define BOOST_TEST_NO_MAIN
#endif

#include <boost/test/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>

#define BOOST_TEST_MODULE Connection_test


BOOST_AUTO_TEST_SUITE(Connection_test)

    BOOST_AUTO_TEST_CASE(Connection_construction__test) {

       ***
    }

BOOST_AUTO_TEST_SUITE_END()

И я компилирую каждый модуль как один исполняемый файл.

Я хотел использовать модуль CodeCoverage.cmake для анализа покрытия кода, но столкнулся с проблемой. Я должен указать тестовый исполняемый файл SETUP_TARGET_FOR_COVERAGE_LCOV, но у меня нет только одного.

Есть ли способ одновременно настроить несколько тестовых исполняемых файлов с помощью CodeCoverage.cmake?


РЕДАКТИРОВАТЬ

Я добавил тесты add_test() в свой корневой файл CMakeLists.txt и изменил свою цель покрытия следующим образом

include(CTest)
add_test(NAME constant_neuron_test COMMAND constant_neuron_test)
add_test(NAME binary_neuron_test COMMAND binary_neuron_test)
add_test(NAME logistic_neuron_test COMMAND logistic_neuron_test)
add_test(NAME connectionFunctionGeneral_test COMMAND connectionFunctionGeneral_test)
add_test(NAME connection_Function_identity_test COMMAND connection_Function_identity_test)
add_test(NAME neural_network_test COMMAND neural_network_test)
add_test(NAME dataset_test COMMAND dataset_test)
add_test(NAME particle_swarm_test COMMAND particle_swarm_test)
add_test(NAME particle_test COMMAND particle_test)
add_test(NAME NeuralNetworkSum_test COMMAND NeuralNetworkSum_test)
add_test(NAME errorfunction_test COMMAND errorfunction_test)
add_test(NAME DESolver_test COMMAND DESolver_test)

include(CodeCoverage.cmake)
APPEND_COVERAGE_COMPILER_FLAGS()
SETUP_TARGET_FOR_COVERAGE_LCOV(
        NAME coverage                 # New target name
        EXECUTABLE ctest -C ${ROOT_DIR}/CTestTestfile.cmake # Executable in PROJECT_BINARY_DIR
        DEPENDENCIES ${Boost_LIBRARIES}         # Dependencies to build first
)

Сам ctest работает правильно:

Test project /home/martin/4Neuro
      Start  1: constant_neuron_test
 1/12 Test  #1: constant_neuron_test ................   Passed    0.04 sec
      Start  2: binary_neuron_test
 2/12 Test  #2: binary_neuron_test ..................   Passed    0.04 sec
      Start  3: logistic_neuron_test
 3/12 Test  #3: logistic_neuron_test ................   Passed    0.05 sec
      Start  4: connectionFunctionGeneral_test
 4/12 Test  #4: connectionFunctionGeneral_test ......   Passed    0.04 sec
      Start  5: connection_Function_identity_test
 5/12 Test  #5: connection_Function_identity_test ...   Passed    0.04 sec
      Start  6: neural_network_test
 6/12 Test  #6: neural_network_test .................   Passed    0.04 sec
      Start  7: dataset_test
 7/12 Test  #7: dataset_test ........................   Passed    0.04 sec
      Start  8: particle_swarm_test
 8/12 Test  #8: particle_swarm_test .................   Passed    0.04 sec
      Start  9: particle_test
 9/12 Test  #9: particle_test .......................   Passed    0.04 sec
      Start 10: NeuralNetworkSum_test
10/12 Test #10: NeuralNetworkSum_test ...............   Passed    0.05 sec
      Start 11: errorfunction_test
11/12 Test #11: errorfunction_test ..................   Passed    0.04 sec
      Start 12: DESolver_test
12/12 Test #12: DESolver_test .......................   Passed    0.05 sec

100% tests passed, 0 tests failed out of 12

Total Test time (real) =   0.53 sec

Но когда я пытаюсь создать отчет о покрытии с помощью make coverage, я получаю такую ​​ошибку:

Processing code coverage counters and generating report.
cd /home/martin/4Neuro/build && /usr/bin/lcov --gcov-tool /usr/bin/gcov -directory . --zerocounters
Deleting all .da files in . and subdirectories
Done.
cd /home/martin/4Neuro/build && /usr/bin/lcov --gcov-tool /usr/bin/gcov -c -i -d . -o coverage.base
Capturing coverage data from .
Found gcov version: 7.3.0
Scanning . for .gcno files ...
geninfo: WARNING: no .gcno files found in . - skipping!
Finished .info-file creation
cd /home/martin/4Neuro/build && ctest -C /home/martin/4Neuro/CTestTestfile.cmake
Test project /home/martin/4Neuro/build
No tests were found!!!
cd /home/martin/4Neuro/build && /usr/bin/lcov --gcov-tool /usr/bin/gcov --directory . --capture --output-file coverage.info
Capturing coverage data from .
Found gcov version: 7.3.0
Scanning . for .gcda files ...
geninfo: WARNING: no .gcda files found in . - skipping!
Finished .info-file creation
cd /home/martin/4Neuro/build && /usr/bin/lcov --gcov-tool /usr/bin/gcov -a coverage.base -a coverage.info --output-file coverage.total
Combining tracefiles.
Reading tracefile coverage.base
lcov: ERROR: no valid records found in tracefile coverage.base
CMakeFiles/coverage.dir/build.make:62: recipe for target 'CMakeFiles/coverage' failed
make[3]: *** [CMakeFiles/coverage] Error 255
make[3]: Leaving directory '/home/martin/4Neuro'
CMakeFiles/Makefile2:70: recipe for target 'CMakeFiles/coverage.dir/all' failed
make[2]: *** [CMakeFiles/coverage.dir/all] Error 2
make[2]: Leaving directory '/home/martin/4Neuro'
CMakeFiles/Makefile2:77: recipe for target 'CMakeFiles/coverage.dir/rule' failed
make[1]: *** [CMakeFiles/coverage.dir/rule] Error 2
make[1]: Leaving directory '/home/martin/4Neuro'
Makefile:132: recipe for target 'coverage' failed
make: *** [coverage] Error 2

РЕДАКТИРОВАТЬ 2

Я изменил свой CMakeLists.txt вот так

include(CTest)
enable_testing()
add_subdirectory(${SRC_DIR} ${PROJECT_BINARY_DIR})

# Adding Unit-tests
add_test(NAME constant_neuron_test COMMAND constant_neuron_test)
add_test(NAME binary_neuron_test COMMAND binary_neuron_test)
add_test(NAME logistic_neuron_test COMMAND logistic_neuron_test)
add_test(NAME connectionFunctionGeneral_test COMMAND connectionFunctionGeneral_test)
add_test(NAME connection_Function_identity_test COMMAND connection_Function_identity_test)
add_test(NAME neural_network_test COMMAND neural_network_test)
add_test(NAME dataset_test COMMAND dataset_test)
add_test(NAME particle_swarm_test COMMAND particle_swarm_test)
add_test(NAME particle_test COMMAND particle_test)
add_test(NAME NeuralNetworkSum_test COMMAND NeuralNetworkSum_test)
add_test(NAME errorfunction_test COMMAND errorfunction_test)
add_test(NAME DESolver_test COMMAND DESolver_test)

include(CodeCoverage.cmake)
APPEND_COVERAGE_COMPILER_FLAGS()
SETUP_TARGET_FOR_COVERAGE_LCOV(
        NAME coverage                 # New target name
        EXECUTABLE ctest -j ${n_cores} # Executable in PROJECT_BINARY_DIR
        DEPENDENCIES
            constant_neuron_test
            binary_neuron_test
            logistic_neuron_test
            connectionFunctionGeneral_test
            connection_Function_identity_test
            neural_network_test
            dataset_test
            particle_swarm_test
            particle_test
            NeuralNetworkSum_test
            errorfunction_test
            DESolver_test         # Dependencies to build first
)
set(COVERAGE_EXCLUDES 'external_dependencies/*')

Но, к сожалению, ошибка сохраняется.

cd /home/martin/4Neuro/build && /usr/bin/lcov --gcov-tool /usr/bin/gcov -c -i -d . -o coverage.base
Capturing coverage data from .
Found gcov version: 7.3.0
Scanning . for .gcno files ...
geninfo: WARNING: no .gcno files found in . - skipping!
Finished .info-file creation
cd /home/martin/4Neuro/build && ctest -j 3
Test project /home/martin/4Neuro/build
No tests were found!!!
cd /home/martin/4Neuro/build && /usr/bin/lcov --gcov-tool /usr/bin/gcov --directory . --capture --output-file coverage.info
Capturing coverage data from .
Found gcov version: 7.3.0
Scanning . for .gcda files ...
geninfo: WARNING: no .gcda files found in . - skipping!
Finished .info-file creation
cd /home/martin/4Neuro/build && /usr/bin/lcov --gcov-tool /usr/bin/gcov -a coverage.base -a coverage.info --output-file coverage.total
Combining tracefiles.
Reading tracefile coverage.base
lcov: ERROR: no valid records found in tracefile coverage.base
CMakeFiles/coverage.dir/build.make:71: recipe for target 'CMakeFiles/coverage' failed
make[3]: *** [CMakeFiles/coverage] Error 255
make[3]: Leaving directory '/home/martin/4Neuro'
CMakeFiles/Makefile2:81: recipe for target 'CMakeFiles/coverage.dir/all' failed
make[2]: *** [CMakeFiles/coverage.dir/all] Error 2
make[2]: Leaving directory '/home/martin/4Neuro'
CMakeFiles/Makefile2:88: recipe for target 'CMakeFiles/coverage.dir/rule' failed
make[1]: *** [CMakeFiles/coverage.dir/rule] Error 2
make[1]: Leaving directory '/home/martin/4Neuro'
Makefile:132: recipe for target 'coverage' failed
make: *** [coverage] Error 2

Вы можете использовать ctest в качестве исполняемого файла. Он запустит ваш модульный тест.

jsantander 10.09.2018 12:21

Кажется, что хотя аргумент объявлен как аргумент многозначный, дальнейшая обработка использует первое имя, предоставленное EXECUTABLE. Может быть, вы можете просто использовать команду SETUP_TARGET_FOR_COVERAGE_LCOV столько раз, сколько ваши тестовые исполняемые файлы; каждая цель покрытия получит другое имя. Не уверен, что происходит с результатами, но я предполагаю, что они объединяются (не использовал этот модуль).

compor 10.09.2018 12:41

@jsantander Я пробовал использовать ctest, как вы предложили. Пока это не работает - см. Мой Edit, пожалуйста.

Eenoku 10.09.2018 12:46

@compor Боюсь, они не соединятся, так как вы должны записывать make один за другим, если я правильно понимаю.

Eenoku 10.09.2018 12:46

В моем проекте он EXECUTABLE ctest -j ${PROCESSOR_COUNT}, и он выбирает два разных исполняемых файла модульного теста.

jsantander 10.09.2018 12:52

@jsantander А как вы перечисляете свои тестовые исполняемые файлы? Также используете add_test()?

Eenoku 10.09.2018 13:02

@jsantander К сожалению, мой все еще не работает ... Если хотите, можете взглянуть на Edit2

Eenoku 10.09.2018 13:22

@Eenoku, вы нашли решение этой проблемы? У меня точно такая же ошибка, как и в вашем «РЕДАКТИРОВАТЬ 2»: никаких тестов не найдено !!!; ctest работает нормально.

r3dapple 15.07.2021 20:33

@ r3dapple К сожалению, я этого не сделал и довольно давно остановил этот проект.

Eenoku 16.07.2021 10:05

@Eenoku Мне удалось создать рабочую установку. Я разместил это как ответ;

r3dapple 17.07.2021 19:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
10
4 794
4

Ответы 4

Хорошо, я попытался воспроизвести минимальный набор ваших настроек.

У меня есть:

.
├── CMakeLists.txt
├── CodeCoverage.cmake
├── test1.cpp
└── test2.cpp

Откуда CodeCoverage.cmake от https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake

CMakeLists.txt - это:

cmake_minimum_required(VERSION 3.10)
find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include(CTest)
enable_testing()

add_executable(test1_test test1.cpp)
target_link_libraries(test1_test 
                      ${Boost_FILESYSTEM_LIBRARY}
                      ${Boost_SYSTEM_LIBRARY}
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
add_executable(test2_test test2.cpp)
target_link_libraries(test2_test
                      ${Boost_FILESYSTEM_LIBRARY}
                      ${Boost_SYSTEM_LIBRARY}
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

add_test(NAME test1_test COMMAND test1_test)
add_test(NAME test2_test COMMAND test2_test)

include(CodeCoverage.cmake)
APPEND_COVERAGE_COMPILER_FLAGS()
SETUP_TARGET_FOR_COVERAGE_LCOV(
        NAME coverage                 
        EXECUTABLE ctest -j ${n_cores} # Executable in PROJECT_BINARY_DIR
        DEPENDENCIES
            test1_test
            test2_test)

И test1.cpp (и test2.cpp) являются

#define BOOST_TEST_MODULE test1

#ifndef BOOST_TEST_DYN_LINK
#define BOOST_TEST_DYN_LINK
#endif

#define BOOST_TEST_MAIN

#include <boost/test/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>

#define BOOST_TEST_MODULE test1


BOOST_AUTO_TEST_SUITE(test1)

    BOOST_AUTO_TEST_CASE(test1__test) {
        BOOST_CHECK_EQUAL(1, 1);
    }

BOOST_AUTO_TEST_SUITE_END()

Сейчас делаю:

mkdir build
cd build
cmake ..

вывод:

-- The C compiler identification is GNU 7.3.0
-- The CXX compiler identification is GNU 7.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Boost version: 1.65.1
-- Found the following Boost libraries:
--   system
--   filesystem
--   unit_test_framework
CMake Warning at CodeCoverage.cmake:116 (message):
  Code coverage results with an optimised (non-Debug) build may be misleading
Call Stack (most recent call first):
  CMakeLists.txt:20 (include)


-- Appending code coverage compiler flags: -g -O0 --coverage -fprofile-arcs -ftest-coverage
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jsantand/t/build

Наконец запускаем make coverage:

Scanning dependencies of target test1_test
[ 20%] Building CXX object CMakeFiles/test1_test.dir/test1.cpp.o
[ 40%] Linking CXX executable test1_test
[ 40%] Built target test1_test
Scanning dependencies of target test2_test
[ 60%] Building CXX object CMakeFiles/test2_test.dir/test2.cpp.o
[ 80%] Linking CXX executable test2_test
[ 80%] Built target test2_test
Scanning dependencies of target coverage
[100%] Resetting code coverage counters to zero.
Processing code coverage counters and generating report.
Deleting all .da files in . and subdirectories
Done.
Capturing coverage data from .
Found gcov version: 7.3.0
Scanning . for .gcno files ...
Found 2 graph files in .
Processing test1_test.dir/test1.cpp.gcno
Processing test2_test.dir/test2.cpp.gcno
Finished .info-file creation
Test project /home/jsantand/t/build
    Start 1: test1_test
1/2 Test #1: test1_test .......................   Passed    0.01 sec
    Start 2: test2_test
2/2 Test #2: test2_test .......................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.02 sec
Capturing coverage data from .
Found gcov version: 7.3.0
Scanning . for .gcda files ...
Found 2 data files in .
Processing test1_test.dir/test1.cpp.gcda
Processing test2_test.dir/test2.cpp.gcda
Finished .info-file creation
Combining tracefiles.
Reading tracefile coverage.base
Reading tracefile coverage.info
Writing data to coverage.total
Summary coverage rate:
  lines......: 65.4% (229 of 350 lines)
  functions..: 68.3% (110 of 161 functions)
  branches...: no data found
Reading tracefile coverage.total
Deleted 0 files
Writing data to /home/jsantand/t/build/coverage.info.cleaned
Summary coverage rate:
  lines......: 65.4% (229 of 350 lines)
  functions..: 68.3% (110 of 161 functions)
  branches...: no data found
Reading data file /home/jsantand/t/build/coverage.info.cleaned
Found 37 entries.
Found common filename prefix "/usr/include"
Writing .css and .png files.
Generating output.
Processing file /home/jsantand/t/test1.cpp
Processing file /home/jsantand/t/test2.cpp
Processing file boost/type_index.hpp
Processing file boost/function/function_base.hpp
Processing file boost/function/function_template.hpp
Processing file boost/smart_ptr/shared_ptr.hpp
Processing file boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp
Processing file boost/smart_ptr/detail/shared_count.hpp
Processing file boost/test/unit_test_suite.hpp
Processing file boost/test/unit_test.hpp
Processing file boost/test/unit_test_log.hpp
Processing file boost/test/tools/assertion_result.hpp
Processing file boost/test/tools/detail/print_helper.hpp
Processing file boost/test/tools/detail/fwd.hpp
Processing file boost/test/tools/old/impl.hpp
Processing file boost/test/tree/observer.hpp
Processing file boost/test/tree/test_unit.hpp
Processing file boost/test/tree/fixture.hpp
Processing file boost/test/tree/decorator.hpp
Processing file boost/test/utils/lazy_ostream.hpp
Processing file boost/test/utils/class_properties.hpp
Processing file boost/test/utils/trivial_singleton.hpp
Processing file boost/test/utils/wrap_stringstream.hpp
Processing file boost/test/utils/basic_cstring/bcs_char_traits.hpp
Processing file boost/test/utils/basic_cstring/basic_cstring.hpp
Processing file boost/type_index/type_index_facade.hpp
Processing file boost/type_index/stl_type_index.hpp
Processing file boost/type_traits/integral_constant.hpp
Processing file c++/7/typeinfo
Processing file c++/7/bits/ios_base.h
Processing file c++/7/bits/move.h
Processing file c++/7/bits/alloc_traits.h
Processing file c++/7/bits/stl_construct.h
Processing file c++/7/bits/stl_vector.h
Processing file c++/7/bits/atomic_base.h
Processing file c++/7/bits/allocator.h
Processing file c++/7/ext/new_allocator.h
Writing directory view page.
Overall coverage rate:
  lines......: 65.4% (229 of 350 lines)
  functions..: 68.3% (110 of 161 functions)
Lcov code coverage info report saved in coverage.info.
Open ./coverage/index.html in your browser to view the coverage report.
[100%] Built target coverage

Большое спасибо! Понятия не имею, почему мой код до сих пор не работает, когда он в основном такой же, как этот. Не могли бы вы взглянуть на мой код ([email protected]: bes0030 / 4Neuro.git, ветка coverage, базовая компиляция с build.sh)? Мне любопытно, будет ли он работать на вашем компьютере.

Eenoku 10.09.2018 14:49

У меня тоже была эта проблема, и я довольно долго боролся, чтобы найти решение. Для меня исправление заключалось в том, чтобы переместить этот код CMake над любыми другими определенными целями:

include(CodeCoverage.cmake)
APPEND_COVERAGE_COMPILER_FLAGS()

Похоже, что если сначала определены цели, то флаги компилятора не обновляются.

В CMake порядок ваших операторов имеет значение, и порядок, в котором вы должны их размещать, не всегда прост. Если кому-то еще нужен ответ на этот вопрос, попробуйте это в начало вашего корневого CMakeLists.txt после определения свойств вашего компилятора. Например:

include(CTest)
enable_testing()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")

include(CodeCoverage)
append_coverage_compiler_flags()
setup_target_for_coverage_gcovr_html(
    NAME coverage
    EXECUTABLE test_basics
    DEPENDENCIES test_basics mysqrt
)

Предполагается, что ваш CodeCoverage.cmake находится в каталоге cmake вашего проекта. Чтобы создать отчет о тестовом покрытии:

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE:STRING=Debug
make coverage

Ваш отчет будет доступен по ссылке ./coverage/index.html.

Мне удалось получить рабочую настройку, которая:

  1. Компилирует код отладки и выпуска с разными флагами компилятора
  2. Запускает тесты
  3. Создает html-отчет о покрытии кода и отделении

Предпосылки

Увеличение:

sudo apt-get install libboost-all-dev

CMake 3.21.0: (перейдите к https://cmake.org/download/ для последней версии)

sudo apt install build-essential libssl-dev
wget https://github.com/Kitware/CMake/releases/download/v3.21.0/cmake-3.21.0.tar.gz
tar -zxvf cmake-3.21.0.tar.gz
cd cmake-3.21.0
./bootstrap
make 
sudo make install 

Настраивать

Структура папки:

┌ mhcl
├──┬ build
│  ├── debug
│  └── release
├──┬ src
│  ├──┬ biginteger
│  │  ├── biginteger.cpp
│  │  └── biginteger.h
│  ├── CMakeLists.txt
│  └── main.cpp
├──┬ test
│  ├── CMakeLists.txt
│  ├── CodeCoverage.cmake
│  ├── test_biginteger_add.cpp
│  ├── test_biginteger_constructor.cpp
│  ├── test_biginteger_divide.cpp
│  └── test_biginteger_multiply.cpp
└── CMakeLists.txt

SRC / biginteger / biginteger.cpp:

...
void BigInteger::add(const BigInteger &summand2){
    if (isNegative() == summand2.isNegative()){
        add_digits(summand2);
    }else{
        subtract_digits(summand2);
    }
    if (getNumber(false) == "0") setNegative(false);
}
...

src / biginteger / biginteger.h:

#ifndef BIGINTEGER_H_INCLUDED
#define BIGINTEGER_H_INCLUDED

#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <stdexcept>

class BigInteger{

    public:
        BigInteger(const char*);
...

mhcl / CMakeLists.txt:

cmake_minimum_required(VERSION 3.20)
add_compile_options(-Wall -Wextra -pedantic -Werror)
project(MHCL VERSION 0.1 DESCRIPTION "mhcl, a cryptographic library" LANGUAGES CXX)

set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -fprofile-arcs -ftest-coverage")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")

add_subdirectory(test)
add_subdirectory(src) 
add_executable (demo src/main.cpp)
target_link_libraries (demo biginteger)

mhcl / src / CMakeLists.txt:

add_library(biginteger biginteger/biginteger.cpp biginteger/biginteger.h)

mhcl / SRC / main.cpp:

#include <iostream>
#include <string>
#include "biginteger/biginteger.h"
// this file is not really necessary for testing
int main(){
    BigInteger b("3");
    return 0;
}

mhcl / test / CMakeLists.txt:

IF(CMAKE_BUILD_TYPE MATCHES Debug)
    find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED) # sudo apt-get install libboost-all-dev
    include_directories (${MHCL_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS})

    add_executable (test_biginteger_constructor test_biginteger_constructor.cpp)
    target_link_libraries (test_biginteger_constructor biginteger ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

    add_executable (test_biginteger_add test_biginteger_add.cpp)
    target_link_libraries (test_biginteger_add biginteger ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

    add_executable (test_biginteger_multiply test_biginteger_multiply.cpp)
    target_link_libraries (test_biginteger_multiply biginteger ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

    add_executable (test_biginteger_divide test_biginteger_divide.cpp)
    target_link_libraries (test_biginteger_divide biginteger ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

    include(CTest)
    enable_testing()

    add_test(NAME test_biginteger_constructor COMMAND test_biginteger_constructor)
    add_test(NAME test_biginteger_add COMMAND test_biginteger_add)
    add_test(NAME test_biginteger_multiply COMMAND test_biginteger_multiply)
    add_test(NAME test_biginteger_divide COMMAND test_biginteger_divide)

    include(CodeCoverage.cmake)
    APPEND_COVERAGE_COMPILER_FLAGS()
    setup_target_for_coverage_gcovr_html(NAME coverage EXECUTABLE ctest --schedule-random -j 4 --test-dir test EXCLUDE "/usr/*" "/mnt/v/r3dapple.github.io/encryption/mhcl/test/*" "/mnt/v/r3dapple.github.io/encryption/mhcl/src/main.cpp" DEPENDENCIES test_biginteger_constructor test_biginteger_add test_biginteger_multiply test_biginteger_divide)
ENDIF()

mhcl / test / CodeCoverage.cmake:

https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake

mhcl / test_biginteger_add.cpp:

#define BOOST_TEST_MODULE BigIntegerTestAdd
#include <boost/test/unit_test.hpp>
#include "../src/biginteger/biginteger.h"

BOOST_AUTO_TEST_SUITE(IDENTITY_ELEMENT)
BOOST_AUTO_TEST_CASE(ADDITION_ZERO_LENGTH1_184_LENGTH2_1_SIGN1_PLUS_SIGN2_PLUS)
{
    BigInteger b("7941336097231331222328305438625646002846406186146402399842122390970234239963370898300943198440768677925436553855703282917116959906917075742261367262117888460342170898243453976126509330");
    b.add("0");
    BOOST_CHECK_EQUAL(b.getNumber(), "7941336097231331222328305438625646002846406186146402399842122390970234239963370898300943198440768677925436553855703282917116959906917075742261367262117888460342170898243453976126509330");
}
BOOST_AUTO_TEST_SUITE_END()
...

использование

Отладка сборки:

cd mhcl/build/debug && cmake -DCMAKE_BUILD_TYPE=Debug ../.. && make && make coverage

Ваш отчет о покрытии находится в mhcl / build / debug / extension / index.html. gcov coverage

Сборка релиза:

cd mhcl/build/debug && cmake -DCMAKE_BUILD_TYPE=Release ../.. && make

Другие вопросы по теме