erlang - CodeCoverage Elixir 的更多指标

标签 erlang elixir tdd code-coverage

背景

我有一个测试套件,我需要知道项目的覆盖范围。 我玩过 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/

相关文章:

garbage-collection - 计数器是否垃圾收集?

phoenix-framework - 生成的新 Controller 在 phoenix-elixir 中不起作用?

elixir - dialyxir mix task to create PLT exits without error or creating table

erlang - 二进制位的参数匹配

ruby - 生成集合的所有 "unique"子集(不是幂集)

concurrency - 是什么让 Erlang 适合软实时应用程序?

elixir - 无法在 Phoenix/Elixir 中渲染没有布局的错误 View

c# - 是否可以使用最小起订量模拟本地初始化的对象?

visual-studio-2010 - 需要来自非域计算机的域帐户的测试代码

tdd - 试图了解Specflow与单元测试框架和BDD的关系