对于许多语言,有各种测量代码覆盖率的工具。但这到底是怎么回事呢?
我有一些想法,这是如何运作的:
覆盖率工具只是在调试器中运行代码并逐步完成吗?是否使用了某种静态分析?还是一些工具只是将一些标记注入源代码,在代码执行时调用这些标记?我还设想,在某些情况下,该平台提供了在较低级别度量覆盖率的工具。
发布于 2018-02-16 22:28:11
代码覆盖工具有两种工作方式:
覆盖度量是一种动态的质量保证工具,因为它度量执行了哪些代码。静态分析是不够的。
如果调试器可用,则可以很容易地在每条语句之后中断正常执行,并将该语句记录为涵盖的语句。然而,所有这些中断都需要显著的运行时成本,这会降低测试的速度。基于调试器的覆盖率工具常常受到调试接口的限制,因为可以收集何种类型的覆盖率。例如,您可能无法在像bar() && baz()这样的表达式中收集分支覆盖率。
检测由编译器或编译后步骤执行,以将代码注入记录覆盖率的可执行文件中。源代码未被修改。这比基于调试器的解决方案具有更少的运行时开销,但需要以特殊的覆盖率收集模式编译程序。
例如,Python coverage.py工具使用Python的内置跟踪钩子。相反,GCC和Clang在使用-fprofile-arcs -ftest-coverage标志编译时支持基于工具的覆盖率集合(您还应该禁用优化并使用调试构建:-g -O0)。收集分支覆盖率的优点:编译器知道机器代码中存在的所有分支,而不仅仅是源代码中容易看到的分支。当程序执行时,它将在一个文件中记录覆盖率,该文件可以使用gcov、lcov、gcovr等工具将其转换为报表。(披露:我维护gcovr.)
一般来说,覆盖度量需要与分析器相同类型的数据。通常,这些工具使用完全相同的基础结构。但是,分析器可以不太精确,因为热点将经常执行。与覆盖工具不同,它们可以使用抽样来衡量执行哪段代码的频率。抽样分析器定期中断进程并收集指向当前位置的堆栈跟踪。这种情况比在每个语句中发生的次数要少,通常每隔几毫秒就发生一次。因此,它们的性能影响较小,但它们的数据不太准确。
发布于 2018-02-16 22:07:09
那得看情况。
对于已编译语言,通常使用编译器支持,即编译器添加附加指令,以增加每行计数器。(或者更确切地说,每个无分支的块。)
对于刚刚编译好的语言来说,同样的情况也是如此,尽管插入额外指令的主要是JIT编译器。
在解释环境中,解释器可能为分析器提供获取信息的接口。
https://softwareengineering.stackexchange.com/questions/366090
复制相似问题