首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何测量代码覆盖率?

如何测量代码覆盖率?
EN

Software Engineering用户
提问于 2018-02-16 22:00:50
回答 2查看 524关注 0票数 2

对于许多语言,有各种测量代码覆盖率的工具。但这到底是怎么回事呢?

我有一些想法,这是如何运作的:

覆盖率工具只是在调试器中运行代码并逐步完成吗?是否使用了某种静态分析?还是一些工具只是将一些标记注入源代码,在代码执行时调用这些标记?我还设想,在某些情况下,该平台提供了在较低级别度量覆盖率的工具。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2018-02-16 22:28:11

代码覆盖工具有两种工作方式:

  • 或者将代码检测为记录覆盖率统计信息,或者
  • 该程序在调试器或分析器或跟踪机制下运行。

覆盖度量是一种动态的质量保证工具,因为它度量执行了哪些代码。静态分析是不够的。

如果调试器可用,则可以很容易地在每条语句之后中断正常执行,并将该语句记录为涵盖的语句。然而,所有这些中断都需要显著的运行时成本,这会降低测试的速度。基于调试器的覆盖率工具常常受到调试接口的限制,因为可以收集何种类型的覆盖率。例如,您可能无法在像bar() && baz()这样的表达式中收集分支覆盖率。

检测由编译器或编译后步骤执行,以将代码注入记录覆盖率的可执行文件中。源代码未被修改。这比基于调试器的解决方案具有更少的运行时开销,但需要以特殊的覆盖率收集模式编译程序。

例如,Python coverage.py工具使用Python的内置跟踪钩子。相反,GCC和Clang在使用-fprofile-arcs -ftest-coverage标志编译时支持基于工具的覆盖率集合(您还应该禁用优化并使用调试构建:-g -O0)。收集分支覆盖率的优点:编译器知道机器代码中存在的所有分支,而不仅仅是源代码中容易看到的分支。当程序执行时,它将在一个文件中记录覆盖率,该文件可以使用gcov、lcov、gcovr等工具将其转换为报表。(披露:我维护gcovr.)

一般来说,覆盖度量需要与分析器相同类型的数据。通常,这些工具使用完全相同的基础结构。但是,分析器可以不太精确,因为热点将经常执行。与覆盖工具不同,它们可以使用抽样来衡量执行哪段代码的频率。抽样分析器定期中断进程并收集指向当前位置的堆栈跟踪。这种情况比在每个语句中发生的次数要少,通常每隔几毫秒就发生一次。因此,它们的性能影响较小,但它们的数据不太准确。

票数 6
EN

Software Engineering用户

发布于 2018-02-16 22:07:09

那得看情况。

对于已编译语言,通常使用编译器支持,即编译器添加附加指令,以增加每行计数器。(或者更确切地说,每个无分支的块。)

对于刚刚编译好的语言来说,同样的情况也是如此,尽管插入额外指令的主要是JIT编译器。

在解释环境中,解释器可能为分析器提供获取信息的接口。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/366090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档