静态库(.lib)Visual Studio 的代码覆盖率
Posted
技术标签:
【中文标题】静态库(.lib)Visual Studio 的代码覆盖率【英文标题】:code coverage for static library(.lib) visual studio 【发布时间】:2016-06-20 19:57:32 【问题描述】:我有一个静态库 (.lib)。我的测试项目中的测试用例在 Visual Studio 中,TC 引用了许多静态库函数。测试用例有效,一切顺利。但我无法获得 .lib 内代码的代码覆盖率,因为我无法添加仪器 .lib。有没有办法获得 .lib 的代码覆盖率?
【问题讨论】:
【参考方案1】:如果您有静态库的源代码,您可以使用您当前的测试项目来测试库中的功能。只需将您的测试项目与在 Visual Studio 中生成库的项目结合起来即可。 如果您没有源代码,您可以设计测试用例来执行此库的黑盒测试。
【讨论】:
我有 .lib 和测试项目的源代码,两者都在同一个解决方案下。测试用例也可以正常工作。但问题在于获得.lib 的代码覆盖率。无法将 .lib 添加到用于测试项目的仪器 img。【参考方案2】:我为此做了很多实验,以下是观察结果。
代码检测在编译时工作。
这意味着当代码被编译时,它也会被检测。因此,对于基于 gcc 的仪器,--ftest-coverage
和 --fprofile-arcs
标志在这里出现。
静态库在编译完成后被链接,因此它不会被检测。由于它没有得到检测,因此不会生成任何数据。
所以接下来的逻辑步骤我还检测了库代码,对其进行了编译,然后从该检测代码生成了静态库。
现在,据我了解,静态库是使用名为 ar
的应用程序工具制作的,在我的 ide 中,它会自动接收 .o
文件。这以前是一个未检测的目标文件。现在,在检测之后期望静态库中的数据也应该针对库中的每个文件进行刷新。但那没有发生。
这意味着两件事之一
1 - .gcno 文件也需要添加它们的或
2 - 只有经过编译的文件才能生成配置文件数据。
现在我做的下一步是修改这个静态库构建步骤并进行以下更改。我原来的行是ar rcs libmylib.a mylib.o
,我把它改成了ar rcs libmylib.a mylib.gcno
。基本上将 gcno 文件包含到静态库中,这显然不起作用。但还是试了一下。
接下来我将.o
和“.gcno”都添加到静态库中。令人惊讶的是,应用程序运行没有错误,但没有生成配置文件数据。这使我相信配置文件数据仅针对在应用程序中编译的文件生成,而不是为链接的文件生成。
我最后一次尝试是直接将目标文件附加到应用程序中,而不是将其链接为静态库存档。 mylib.o
。这已经是一个检测对象。但是这个已经检测的对象会在链接时再次添加。因此,除非您的代码在编译时存在,否则理论上无法从中生成配置文件数据。
我不确定动态链接库。但以上是我从我进行的实验中观察到的。
【讨论】:
以上是关于静态库(.lib)Visual Studio 的代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017 动态链接库(DLL /LIB) 静态链接库(LIB)的思考
Visual studio那些破事。。。(生成静态库生成动态库引用静态库引用动态库)