簡體   English   中英

如何在TravisCI中為帶有CMake項目的C ++正確配置CodeCov?

[英]How to properly configure CodeCov for a C++ w/ CMake project in TravisCI?

我試圖使用TravisCI在GitHub存儲庫上配置CodeCov。 由於我的存儲庫是C ++,並且已經使用了CMake,因此我實際上將本示例after_success標簽復制粘貼到了.travis.yml文件中:

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/********

問題出在Cmake編譯器和鏈接器標志上。 為了使GCov(GCC的一部分,由lcov )提供性能分析信息和覆蓋率測試,必須設置一些標志。

C單元測試的代碼覆蓋率

具體來說,您需要編譯器向目標代碼中添加分析信息,這是通過在編譯命令中添加標志-fprofile-arcs-ftest-coverage來完成的。

第一個標志將邏輯添加到目標代碼以生成通用配置信息。 這是有關每個基本塊執行頻率的信息。 當您的程序運行時,所有這些信息將被保存到.o文件旁邊的擴展名為.da的新文件中。 該文件中的數據不是特定於覆蓋率的,但是它將由gcov使用。

傳遞給GCC的第二個標志-ftest-coverage也將為目標文件添加邏輯。 這次,目標是輸出特定於覆蓋范圍的信息。 將生成兩個文件,.bb和.bbg。 .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選項編譯的庫鏈接,則仍然需要添加鏈接器標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM