背景
我有一个测试套件,我需要知道项目的覆盖范围。
我玩过 mix test --cover
但我找到了 native erlang's coverage analysis tool充其量是不够的。
native 覆盖工具不会告诉您有关分支覆盖或函数覆盖的信息。唯一的指标似乎是相关行,我不知道它们是如何计算的。据我所知,这只是最基本的测试覆盖形式:查看是否执行了给定的文本行。
你尝试了什么?
我试过了Coverex但结果是灾难性的。它不仅会遇到与 native 工具相同的问题,而且似乎不会产生正确的结果,因为它将导入的模块计为未经测试。
或者也许它做得很好而我的代码没有经过充分测试,但我不能确定,因为它没有告诉我如何它正在评估我的代码。文件中有 40% 的覆盖率?我错过了什么?我不知道,工具不会告诉我。
我现在正在使用 ExCoveralls .它比以前的选项要好得多,它允许我轻松配置我想忽略的文件夹,但是它使用 native 覆盖工具,所以它几乎会遇到同样的问题。
你想要什么?
我希望在 Istanbul 尔的线路中找到一些东西,或者在这种情况下 nyc
:
https://github.com/istanbuljs/nyc
它的测试覆盖率分析告诉我我需要知道的一切,指标和所有:
分支、函数、行、语句,你需要知道的一切都在那里。
问题
- 是否有任何工具使用 Istanbul 通过 Elixir 而非原生 erlang 来衡量代码覆盖率?
- 如果没有,是否有办法配置 native 覆盖工具以提供更多信息?
- 原生覆盖工具使用哪些指标?
最佳答案
原生覆盖工具在源代码、记录模块、函数、元数、子句号和行号的每一行插入“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/