我试图通过为souce文件创建googletest单元测试然后使用gcov获取覆盖结果,最后使用lcov生成html文档来收集库文件foobar.cpp的覆盖结果。
我已经让单元测试和 gcov 结果正常工作但 lcov 从来没有描述正确的覆盖结果,完全省略了我的 foobar.cpp .gcov 结果?
我有一个单元测试平台,基本上是这样设置的:
目录:
~/svn/googletest-read-only/
/src
gtest_main.cc
gtest-all.cc
/include
~/code/proj/
foobar.cpp
foobar.hpp
~/code/proj/unittest/
foobar_test.cpp
Makefile
一切都从unittest/运行,我 make ,在这个文件夹中unittest/ $ make
生成一个可执行的foobar_test 。main()在googletest /src/gtest_main.cc文件中。我的 Makefile 基于 googletest 并具有以下值得注意的设置:
生成文件:
CXXFLAGS += -g -O0 --coverage -fprofile-arcs -ftest-coverage -Wall -Wextra -pthread
LDFLAGS = -lpthread -lgcov
foobar_test : foobar.o foobar_test.o gtest_main.a
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) $^ -o $@
我运行一次可执行文件$ ./foobar_test
。这会生成 .gcda 以匹配每个源的 .gcno(总共 4 倍:foobar、foobar_test、gtest_main 和 gtest-all)。
然后$ gcov foobar.cpp
仅在 foobar.cpp 上运行(我也尝试过类似$ gcov *.cpp
的替代方法......仅使用 foobar_test.cpp 不起作用)。这会产生标准输出,其中包括一堆 /usr/lib 废话,还有我的结果:文件 '../foobar.cpp'; 执行的行数:80 行的 61.25%;..`并创建我的 .gcov 文件。
检查我的 .cpp.gcov 文件,它显示了 61.25% 的行的良好命中率,如上所述。此时我有 4x .gcda、4x 、gcno 和大约 20x 其他 .gcov 文件。
现在,当我在这里尝试使用 lcov 时,lcov --directory . -c -o result.info
它出错了。
lcov 结果:
Capturing coverage data from .
Found gcov version: 4.4.7
Scanning . for .gcda files ...
Found 4 data files in .
Processing ./gtest_main.gcda
geninfo: WARNING: cannot find an entry for foobar.cpp.gcov in .gcno file, skipping file!
geninfo: WARNING: cannot find an entry for *more c++ files*.gcov in .gcno file, skipping file!
Processing ./foobar.gcda
geninfo: WARNING: no data found for /home/asdf/code/proj/foobar.cpp
Processing ./foobar_test.gcda
geninfo: WARNING: no data found for /home/asdf/code/proj/unittest/foobar_test.cpp
Processing ./gtest-all.gcda
Finished .info-file creation```
在 a 之后查看 lcov 输出$ genhtml report.info --output-directory report && firefox report/index.html
仅显示大约 5 个不包含任何 foobar* 文件的目录?
我尝试了多种组合$ gcov []cpp
以及$ lcov --base-directory [] --directory [] -c -o
无济于事。还尝试软链接一些源文件,没有帮助。
我的设置或命令需要改变什么?欢迎评论者提出更好的解决方案。