如何在TravisCI中为C ++ w / CMake项目正确配置CodeCov?

时间:2017-07-06 17:32:06

标签: c++ github code-coverage travis-ci static-analysis

我试图用TravisCI在我的GitHub仓库上配置CodeCov。由于我的回购是使用C ++而我已经使用过CMake,因此我基本上将after_success this example标签复制粘贴到我的 .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的文档在任何地方都没有提及,所以我想我错过了我的配置中的一个重要步骤(或者由于某种原因可能找不到文件......?) / p>

这是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 个答案:

答案 0 :(得分:2)

问题在于Cmake编译器和链接器标志。为了使GCov(GCC的一部分,并由lcov使用)提供分析信息和覆盖测试,必须设置一些标志。

来自Code Coverage for C Unit Tests

  

具体来说,您需要编译器向对象代码添加分析信息,这是通过将标志-fprofile-arcs-ftest-coverage添加到编译命令来完成的。

     

第一个标志将逻辑添加到目标代码以生成通用分析信息。这是关于每个基本块执行频率的信息。运行程序时,所有这些信息都将保存到.o文件旁边的扩展名为.da的新文件中。此文件中的数据不是特定于coverage的,但它将由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选项编译的库链接,则仍需要添加链接器标记。