55

私は自分のプロジェクトでCMakeを使用しており、継続的/夜間のビルド用にcdashサーバーをセットアップしています。すべてが正常に機能し、crontabを設定することで、毎時/毎晩のビルド/テスト結果がcdashサーバーに自動的にアップロードされます。

次のステップは、テストカバレッジレポートをビルドに追加することです。このドキュメントはhttp://www.cmake.org/Wiki/CTest:Coverageにありますが、率直に言って、実用的なガイドからは少し遠いです。

現在、必要なフラグを追加しました(代わりに-fprofile-arcs -ftest-coverage、私は--coverageより良いと思います)、コンパイルプロセスは.gcnoファイルを生成します。しかし、それから私は立ち往生しています。コマンド

make NightlyCoverage

何もしていないようです。誰かが次に何をすべきか教えてもらえますか?私が望む結果は、実行することによってmake NightlyCoverage、カバレッジレポートが生成され、cdashサーバーにアップロードされることです。

4

4 に答える 4

56

https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmakeを正常に使用しています。

ガイドラインに従っただけです:ファイルを私のCMAKE_MODULE_PATHディレクトリに追加し、追加しました

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules)
if(CMAKE_COMPILER_IS_GNUCXX)
    include(CodeCoverage)
    setup_target_for_coverage(${PROJECT_NAME}_coverage ${PROJECT_TEST_NAME} coverage)
endif()

私のCMakeLists.txtgcovまた、ターゲットの依存関係として手動で追加しました。

if(CMAKE_COMPILER_IS_GNUCXX)
    target_link_libraries(${PROJECT_TEST_NAME} gcov)
endif()

これで、私はただタイプします

make my_project_coverage

coverageビルドツリーのディレクトリにあるhtmlレポートを取得します。

于 2013-05-14T06:22:07.163 に答える
10

私は:なしでGCCコードカバレッジレポートgcovrを作成するために使用します:CodeCoverage.cmake

$ cd /path/to/your/project
$ mkdir build && cd build && cmake ..
$ make && make test
$ gcovr -r ../ .
于 2017-09-15T06:23:05.690 に答える
6

プロジェクト「foo」を次のように設定しました。cmakeファイルをhttps://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmakeからサブディレクトリ「cmake_modules」にコピーしました。add_executable(foo ...)私が以下を追加した後のCMakeLists.txtファイルに:

if(CMAKE_COMPILER_IS_GNUCXX)
LIST(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
include(CodeCoverage)
APPEND_COVERAGE_COMPILER_FLAGS()
set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*') // this is optional if you want to exclude some directory from the report
SETUP_TARGET_FOR_COVERAGE_LCOV(NAME foo_coverage
                              EXECUTABLE foo
                              DEPENDENCIES foo)
endif()

cmakeの後、ターゲットをビルドしますmake make foo_coverageそして、ビルドフォルダーのfoo_coverageフォルダーにあるindex.htmlファイルを含むレポートを開きます

于 2019-01-02T09:45:09.200 に答える
3

この答えは@rcomblenの答えと同じですが、少し時代遅れなので、私の解決策を共有します。これが私がしたことです:

  1. おもちゃのプロジェクトを作成しました
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ tree -L 2
.
├── CMakeLists.txt
├── cmake
│   └── CodeCoverage.cmake
├── src
│   ├── domath.cpp
│   ├── domath.h
│   └── testdomath.cpp
└── third_party
    └── googletest

どこ

// src/domath.h

#ifndef COVERAGETEST_DOMATH_H
#define COVERAGETEST_DOMATH_H


class domath {

public:
    int add(int a, int b);
};


#endif //COVERAGETEST_DOMATH_H

// src/domath.cpp

#include "domath.h"

int domath::add(int a, int b) {
    return a + b;
}

// src/testdomath.cpp
#include "gtest/gtest.h"
#include "domath.h"


TEST(DoMathTests, testAdd){
    domath m;
    int actual = m.add(4, 6);
    ASSERT_EQ(10, actual);
}
  1. googletestをダウンロードして、サードパーティのディレクトリに配置します
  2. このスレッドの他の回答によってとても親切に共有された要点をにコピーしますcmake/CodeCoverage.cmake
  3. インストールしgcovrます。gcovrこのスレッドの他の回答は、私がすでに持っていたバージョンでは機能しなくなったため、この手順は非常に重要です。
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ pip install gcovr
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ gcovr --version
gcovr 4.2
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ which gcovr
/home/ciaran/miniconda3/bin/gcovr

gcovrcmakeスクリプト用の出力が必要であることに注意してください。4)ライブラリ、テスト実行可能ファイルを作成し、CodeCoverage.cmakeモジュールを使用するcmakeスクリプトを記述します。

cmake_minimum_required(VERSION 3.15)
project(CoverageTest)

set(CMAKE_CXX_STANDARD 14)

# setup googletest
add_subdirectory(third_party/googletest)

# create our library
add_library(DoMath STATIC src/domath.h src/domath.cpp)
add_dependencies(DoMath gtest gtest_main)

# create the test executable
add_executable(TestDoMath src/testdomath.cpp)
target_include_directories(TestDoMath PRIVATE third_party/googletest/googletest)
target_link_libraries(TestDoMath PRIVATE
        DoMath gtest gtest_main)
add_dependencies(TestDoMath DoMath gtest gtest_main)

# now for coverage bits
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
if (CMAKE_COMPILER_IS_GNUCXX)
    include(CodeCoverage)
    append_coverage_compiler_flags()

    # we need to turn off optimization for non-skewed coverage reports
    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -O0")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")

    # optional excludes - None needed here
    #    set(COVERAGE_EXCLUDES)

    # importantly, set the path to the gcovr executable that you downladed
    set(GCOVR_PATH "/home/ciaran/miniconda3/bin/gcovr")
    # Works
    setup_target_for_coverage_gcovr_xml(
            NAME TestDoMathCoverageXml
            EXECUTABLE TestDoMath
            DEPENDENCIES TestDoMath DoMath
    )
    # Works
    setup_target_for_coverage_gcovr_html(
            NAME TestDoMathCoverageHtml
            EXECUTABLE TestDoMath
            DEPENDENCIES TestDoMath DoMath
    )
    # This one did not work for me:
    setup_target_for_coverage_lcov(
            NAME TestDoMathCoverageLcov
            EXECUTABLE TestDoMath
            DEPENDENCIES TestDoMath DoMath
    )
endif ()

以上です。次に、新しいターゲットを作成します。

幸運を。

于 2020-07-04T14:39:30.850 に答える