单元测试——在较大的项目(静态库,…)上进行



我正在做一个更大的项目,它有以下目录布局:

Source
 MyA
  aa.cpp
  ab.cpp
  ac.cpp
 MyB
  ba.cpp
  bb.cpp
  bc.cpp
 MyTest
  testaa.cpp
  testab.cpp
  testac.cpp
  testba.cpp
  testbb.cpp
  testbc.cpp
  main.cpp
Build
 MyA
  aa.o
  ab.o
  ac.o
  libMyA.a (static library)
 MyB
  ba.o
  bb.o
  bc.o
  libMyB.a (static library)
 MyTest
  testaa.o
  testab.o
  testac.o
  testba.o
  testbb.o
  testbc.o
  MyTest (executable)

-fprofile-arcs -ftest-coverage编译后,我在Build/MyTest目录下执行MyTest应用程序。正如所料,有*。gno和*。Build目录下的gcda文件。在MyTest目录下运行gcov后,不同的*。gcov文件会生成,但不幸的是,并不是MyA和MyB中的所有内容都会生成gcov文件,尽管在这两个库中都会调用每个函数。尝试了不同的选项,但不知何故,我无法创建有用的(意味着正确)*。

如果我复制一个目录中的每个cpp,并重复步骤,一切都如预期的那样工作,覆盖率分析是完美的。

  1. 必须指定源文件作为g++/gcc的绝对路径。不要使用带有".."或"foo/bar.cpp"的相对路径,否则你会得到类似"geninfo: WARNING: no data found for XXXX"的错误。

  2. 不要在g++/gcc的命令行中包含任何头文件。否则你会得到"stamp mismatch with graph file"错误

因此,当有多个目录时,以下操作应该可以工作:

g++ --coverage -DDEBUG -g3 heyo.cpp /app/helper/blah.cpp /app/libfoo/foo.cpp -o program
./program
lcov --directory . --capture --output-file app.info
genhtml --output-directory cov_htmp app.info

或者,如果你在一个已经使用了相对路径的Makefile中,那么使用:

g++ --coverage -DDEBUG -g3 $(abspath heyo.cpp helper/blah.cpp ../foo/bar/baz.cpp) -o program

为了能够保持您的目录结构,您需要在每个源文件文件夹中运行一次gcov,但是使用-o选项告诉gcov数据文件的位置。

我认为应该是这样的:

gcov -o ../../Build/MyA *.cpp

我有一个项目与类似的源文件结构,但我让编译器转储对象文件等进入源文件夹。然后,我从根文件夹运行gcov多次,每个源文件一次,但我指定源文件的相对路径,并使用-o选项指定相对文件夹,如下所示:

gcov -o Source/MyA Source/MyA/aa.cpp

如果您彻底地手动执行了产品或应用程序测试,并且花费了大量的精力。如果您的目标是使用lcov和gcov获得代码覆盖率报告,但错误地删除了gcno文件。您可以通过重新编译代码来重新生成gcno文件,但它将使用新的时间戳生成,并且gcov报告错误说"戳记与图形文件不匹配",并且不会生成代码覆盖率报告。这将导致您所有的测试工作被浪费。

仍然有一个生成代码覆盖率报告的快捷方式。这只是一个变通方法,不应该一直依赖。建议保存*。Gcno文件,直到测试完成。

记下您的gcc版本(gcc -v)并从一个镜像站点下载其源代码例如- ftp://gd.tuwien.ac.at/gnu/sourceware/gcc/releases/gcc-4.4.6/gcc-4.4.6.tar.bz2

解压下载文件后,gcc的文件夹结构将如下所示gcc-4.4.6gcc-4.4.6/gcc

如果你直接进入gcc-4.4.6/gcc,并尝试从那里执行。/configure和编译(make),那么你会遇到下面的问题Build/genmodes -h> tmp-modes.h/bin/sh: build/genmodes: No such file or directory

解决方案是do ./configure和make from gcc-4.4.6,不会显示与genmodes相关的错误。这将编译包括gcc在内的所有模块。如果./configure

显示任何错误,您可能需要安装gcc所需的mpfr和gmp模块。

转到gcc-4.4.6/gcc/gcov.c并在下面的行中注释,然后用上面的命令重新编译

/*  if (tag != bbg_stamp)
    {
      fnotice (stderr, "%s:stamp mismatch with graph filen", da_file_name);
      goto cleanup;
    }*/

编译后的gcov二进制文件示例路径为gcc-4.4.6/host-x86_64-unknown-linux-gnu/gcc/gcov

将此二进制文件放入/usr/bin中,并使用命令重新生成代码覆盖率报告,如下面的示例所示Lcov——capture——directory ./——output-file coverage.info;——输出目录/var/www/html/coverage

现在你应该不会得到"stamp mismatch with graph file"错误,你会得到代码覆盖率报告

最新更新