2017-07-06 13 views
0

TravisCIでGitHubリポジトリにCodeCovを設定しようとしていました。私のレポはC++であると私はすでにCMakeのを使用しているので、私は基本的にコピー&ペーストthis exampleafter_successラベルは私の.travis.ymlファイルに:TravisCIでC++ w/CMakeプロジェクト用のCodeCovを正しく設定する方法は?

after_success: 
    # Creating report 
    - cd ${TRAVIS_BUILD_DIR} 
    - lcov --directory . --capture --output-file coverage.info coverage info 
    - lcov --remove coverage.info '/usr/*' --output-file coverage.info 
    - lcov --list coverage.info 
    # Uploading report to CodeCov 
    - bash <(curl -s https://codecov.io/bash) || echo "Codecov did not collect coverage reports" 

私は私のトークンとの通知を提供するために、カスタム.codecov.ymlファイルをプッシュafter_successは例で示唆されたものに過ぎません。私は実際にはlcovに精通していないので、何か他のものがないか、それらの呼び出しが何であるか分かりません。

CodeCovのドキュメントを見ると、私は紛失しているかもしれませんが、lcovのファイルは.gcdaというファイルが見つからないため、私のカバレッジレポートは空です。 CodeCovのドキュメントにはどこにも言及していないので、設定に重要なステップがないと思います(何らかの理由でファイルが見つかりません...)

これはTravisCIのafter_successの出力ですステージ:

$ lcov --directory . --capture --output-file coverage.info 
Capturing coverage data from . 
Found gcov version: 4.8.4 
Scanning . for .gcda files ... 
geninfo: ERROR: no .gcda files found in .! 

$ lcov --remove coverage.info '/usr/*' --output-file coverage.info 
Reading tracefile coverage.info 
lcov: ERROR: no valid records found in tracefile coverage.info 

$ lcov --list coverage.info 
Reading tracefile coverage.info 
lcov: ERROR: no valid records found in tracefile coverage.info 

$ bash <(curl -s https://codecov.io/bash) || \ 
    echo "Codecov did not collect coverage reports" 
    _____   _ 
/____|  | | 
| |  ___ __| | ___ ___ _____ __ 
| | /_ \/_` |/ _ \/ __/ _ \ \// 
| |___| (_) | (_| | __/ (_| (_) \ V/
\_____\___/ \__,_|\___|\___\___/ \_/ 
           Bash-8fda091 
==> Travis CI detected. 
    project root: . 
--> token set from env 
    ... 
==> Running gcov in . (disable via -X gcov) 
==> Python coveragepy not found 
==> Searching for coverage reports in: 
    + . 
    -> Found 3 reports 
==> Detecting git/mercurial file structure 
==> Appending build variables 
    + TRAVIS_OS_NAME 
==> Reading reports 
    - Skipping empty file ./coverage.info 
    + ./doc/****.zip bytes=337165   -----> That's not a report. 
    + ./doc/****.pdf bytes=353614   -----> That's not a report. 
==> Appending adjustments 
    http://docs.codecov.io/docs/fixing-reports 
    + Found adjustments 
==> Uploading reports 
    url: https://codecov.io 
    query: branch=codecov&commit=*****... 
    -> Pinging Codecov 
    -> Uploading to S3 https://codecov.s3.amazonaws.com 
    -> View reports at https://codecov.io/github/******** 

答えて

1

問題は、Cmakeコンパイラとリンカのフラグが原因でした。 GCov(GCCの一部で、lcovによって使用される)がプロファイリング情報とカバレッジテストを提供するためには、いくつかのフラグを設定する必要があります。 Code Coverage for C Unit Testsから

具体的には、あなたのコンパイルコマンドにフラグ-fprofile-arcs-ftest-coverageを追加することによって行われるオブジェクトコードにプロファイリング情報を追加するコンパイラが必要です。

最初のフラグは、オブジェクトコードにロジックを追加して、一般的なプロファイリング情報を生成します。これは、各基本ブロックの実行頻度に関する情報です。プログラムが実行されると、これらの情報はすべて.oファイルの横に拡張子が.daの新しいファイルに保存されます。このファイルのデータは、カバレッジ固有のものではありませんが、gcovによって使用されます。

GCCに渡した2番目のフラグ-ftest-coverageも、オブジェクトファイルにロジックを追加します。今回は、カバレッジ固有の情報を出力することを目標としています。生成されるファイルは.bbと.bbgの2つです。 .bbファイルは基本ブロックから行番号への単純なマッピングファイルです。 .bbgファイルには、アプリケーションの実行時に実行された、対応するソースファイル内の各アークがリストされます。このデータはgcovによって実際のプログラムフローグラフを再構成するために使用され、そこからすべての基本ブロックとアークの実行回数が計算されます。

また、ソースは-lgcov --coverageとリンクする必要があります。私はcmakeのを使用していますので、私の場合、私はset_target_properties機能でこれらを指定する必要が:、あなたは通常、あなたのカバレッジレポートでは、あなたのユニットテストを含めたくないので、

add_executable(dss-sim dss-sim.cpp) 
target_link_libraries(dss-sim 
    list 
    of 
    my 
    static 
    libs 
) 
# The libs above also need to be compiled with the same flags. 
set_target_properties(dss-sim 
    PROPERTIES 
    COMPILE_FLAGS "-ftest-coverage -fprofile-arcs" 
    LINK_FLAGS "-lgcov --coverage" 
) 

最後に、あなたはしませんはそれらのコンパイラフラグを定義します。ただし、ユニットテストをgcovオプションでコンパイルされたライブラリとリンクさせる場合、リンカフラグを追加する必要があります。

+1

新しいバージョンのGCCでは、すべての場合に--coverageを使用できます。 https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.htmlを参照してください。 –

関連する問題