软件测试覆盖率在软件开发中至关重要。测试确保软件按预期运行,而测试覆盖率则确保您检查了代码的所有可能性,两者相辅相成。许多现代语言在 50% 的情况下都具有生成覆盖率摘要的库或工具,但您知道 C 语言也有一个“原生”工具吗?
让我们从一个简单的只返回 ±42 的代码开始:
<code class="language-c">#include <stdbool.h> int return_42(bool ret_neg) { if (ret_neg) return -42; return 42; }</code>
现在是简单的测试文件:
<code class="language-c">#include <assert.h> #include <stdbool.h> #include <stdio.h> int return_42(bool ret_neg); int main() { assert(return_42(false) == 42); assert(return_42(true) == -42); puts("Nice"); return 0; }</code>
现在,我们可以使用 gcc/cc 编译器和 -fprofile-arcs
和 -ftest-coverage
标记编译代码。
这将生成一个可执行文件和扩展名为 .gcno
的文件。
创建这些文件后,我们运行测试,运行结束后将创建扩展名为 .gcda
的文件。
有了这些新创建的文件,我们可以使用 gcov 工具处理它们(请先安装 gcov),然后执行 gcov 并传入 .gcda
和 .gcno
文件名(通常它们与 .c
文件同名,但也可能不同)。这将生成扩展名为 .gcov
的文件。gcov 将提供一个关于覆盖率的小型摘要,但是对于超过一个简单的测试(例如,我在一个库中超过 120 个测试),我们需要更直观的显示结果。
接下来,我们将使用 lcov(请先安装 lcov),使用 -c
、-d .
和 -o foobar.info
标记运行 lcov。它将生成一个名为 foobar.info
的文件,并打印覆盖率摘要。不幸的是,这个摘要没有说明哪些函数被检查到,但是有了创建的 .info
文件,我们可以使用 -l foobar.info
标记运行 lcov,它将打印一个更易读的表格摘要。然而,我们仍然只得到一个百分比,无法看到哪些行被检查到,因此让我们进入最后一步,使结果更易于可视化。
只需使用 genhtml,传入 foobar.info
和 -o bar_html
标记。genhtml 将生成一个包含更易读的覆盖率摘要的文件夹(您可以随意打开此 html 文件,我个人最喜欢的打开方式是使用 python -m http.server -d bar_html
)。
您也可以使用 clang,但标记会发生变化。由于我不太喜欢 clang,并且觉得最终结果不太美观,所以我没有深入研究,但据我尝试,所有功能都可以使用 llvm 运行,您只需安装两个 llvm 工具即可。
最后,genhtml 具有许多可定制的标记,我的常用标记如下:
好了,今天就到这里,下次再见!
以上是C IS中的C测试覆盖范围会教您如何使用的详细内容。更多信息请关注PHP中文网其他相关文章!