Больше метрик для CodeCoverage Elixir - PullRequest
0 голосов
/ 21 ноября 2018

Фон

У меня есть набор тестов, и мне нужно знать охват проекта.Я играл с mix test --cover, но мне кажется, что инструмент анализа покрытия нативного эрланга в лучшем случае недостаточен.

Родной инструмент покрытия не говорит вам ни о покрытии филиала, ни о функциональном покрытии.Похоже, это всего лишь метрика соответствующих строк , которую я не знаю, как они рассчитывают.Насколько я знаю, это всего лишь основная форма тестового покрытия: посмотрите, была ли выполнена заданная текстовая строка.

Что вы пробовали?

Я пробовал Coverex но результат был катастрофическим.Он не только страдает от тех же проблем, что и нативный инструмент, но и не дает правильных результатов, поскольку считает импортированные модули непроверенными.

Или, может быть, он отлично работает, и мой код плохо протестирован, но я не могу знать наверняка, потому что он не говорит мне как оценивает мойкод .Есть 40% покрытия в файле?Чего мне не хватает?Я не могу знать, инструмент не скажет мне.

Я сейчас использую ExCoveralls .Это значительно лучше, чем предыдущие опции, он позволяет мне легко настраивать, какие папки я хочу игнорировать, , но он использует собственный инструмент покрытия, поэтому он в значительной степени страдает от тех же проблем.

Что вы хотите?

Я надеялся найти что-то среди стамбульских линий, или в этом случае nyc:

https://github.com/istanbuljs/nyc

Это тестанализ покрытия говорит мне все, что мне нужно знать, метрики и все:

enter image description here

Филиалы, функции, строки, выписки, все, что вам нужно знать, есть,

Вопросы

  1. Есть ли какой-нибудь инструмент, который использует Стамбул для метрики покрытия кода с помощью Elixir вместо собственного erlang?
  2. Если нет, есть ли способнастроить собственный инструмент покрытия для предоставления мне дополнительной информации?
  3. Какие показатели использует собственный инструмент покрытия?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Чтобы добавить к @legoscia отличный ответ, я также хочу уточнить, почему cover не выполняет оценку утверждений.Согласно этому обсуждению на официальном форуме:

https://elixirforum.com/t/code-coverage-tools-for-elixir/18102/10

Код сначала компилируется в erlang, а затем из erlang в модифицированный двоичный файл (но файл .beam не создается)это автоматически загружается в память и выполняется.

Из-за того, как работает код erlang, один оператор может иметь несколько инструкций:

и одна строка может привести к нескольким «операторам» ВМ, дляпример:

Integer.to_string(a + 1)

Результатом будет 2 инструкции:

{line,[{location,"lib/tasks.ex",6}]}.
{gc_bif,'+',{f,0},1,[{x,0},{integer,1}],{x,0}}.
{line,[{location,"lib/tasks.ex",6}]}.
{call_ext_only,1,{extfunc,erlang,integer_to_binary,1}}.

Поэтому инструменту автоматического анализа довольно сложно обеспечить покрытие операторов, поскольку трудно сопоставить операторы с инструкциями,тем более что теоретически компилятор может свободно переупорядочивать команды, если пожелает, если результат одинаков.

0 голосов
/ 22 ноября 2018

Собственный инструмент покрытия вставляет вызовы «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}]}.

( из cover.erl)

Как уже упоминалось в сопроводительной документации , вы можете получить покрытие для модулей, функций, функциональных предложений и строк.Похоже, что 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()
...