gpt4 book ai didi

erlang - CodeCoverage Elixir 的更多指标

转载 作者:行者123 更新时间:2023-12-04 01:50:19 26 4
gpt4 key购买 nike

背景

我有一个测试套件,我需要知道项目的覆盖范围。我玩过 mix test --cover 但我找到了 native erlang's coverage analysis tool充其量是不够的。

native 覆盖工具不会告诉您有关分支覆盖或函数覆盖的信息。唯一的指标似乎是相关行,我不知道它们是如何计算的。据我所知,这只是最基本的测试覆盖形式:查看是否执行了给定的文本行。

你尝试了什么?

我试过了Coverex但结果是灾难性的。它不仅会遇到与 native 工具相同的问题,而且似乎不会产生正确的结果,因为它将导入的模块计为未经测试。

或者也许它做得很好而我的代码没有经过充分测试,但我不能确定,因为它没有告诉我如何它正在评估我的代码。文件中有 40% 的覆盖率?我错过了什么?我不知道,工具不会告诉我。

我现在正在使用 ExCoveralls .它比以前的选项要好得多,它允许我轻松配置我想忽略的文件夹,但是它使用 native 覆盖工具,所以它几乎会遇到同样的问题。

你想要什么?

我希望在 Istanbul 尔的线路中找到一些东西,或者在这种情况下 nyc:

https://github.com/istanbuljs/nyc

它的测试覆盖率分析告诉我我需要知道的一切,指标和所有:

enter image description here

分支、函数、行、语句,你需要知道的一切都在那里。

问题

  1. 是否有任何工具使用 Istanbul 通过 Elixir 而非原生 erlang 来衡量代码覆盖率?
  2. 如果没有,是否有办法配置 native 覆盖工具以提供更多信息?
  3. 原生覆盖工具使用哪些指标?

最佳答案

原生覆盖工具在源代码、记录模块、函数、元数、子句号和行号的每一行插入“bump”调用:

bump_call(Vars, Line) ->
A = erl_anno:new(0),
{call,A,{remote,A,{atom,A,ets},{atom,A,update_counter}},
[{atom,A,?COVER_TABLE},
{tuple,A,[{atom,A,?BUMP_REC_NAME},
{atom,A,Vars#vars.module},
{atom,A,Vars#vars.function},
{integer,A,Vars#vars.arity},
{integer,A,Vars#vars.clause},
{integer,A,Line}]},
{integer,A,1}]}.

( from cover.erl )

上面函数插入的代码是:

ets:update_counter(?COVER_TABLE,
{?BUMP_REC_NAME, Module, Function, Arity, Clause, Line}, 1)

也就是说,将给定模块/函数/行的条目递增 1。在所有测试完成后,cover 将使用此表中的数据并显示给定行执行了多少次。


the cover documentation 中所述,您可以获得模块、函数、函数子句和行的覆盖率。看起来 ExCoveralls 在其报告中只使用线覆盖,但没有理由不能使用所有四种类型的覆盖。

不支持分支覆盖。似乎支持分支覆盖需要扩展“bump”记录并更新 cover.erl 以记录该信息。在有人这样做之前,覆盖信息只有在分支出现在不同线路上时才是准确的。例如:

case always_false() of
true ->
%% this line shows up as not covered
do_something();
false ->
ok
end.

%% this line shows up as covered, even though do_something is never called
always_false() andalso do_something()

关于erlang - CodeCoverage Elixir 的更多指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com