Как мне прочитать Отчет об охвате в Стамбуле?

131

Я всегда использовал Jasmine для своих модульных тестов, но недавно я начал использовать Istanbul, чтобы предоставлять отчеты о покрытии кода. Я имею в виду, что я понимаю суть того, что они пытаются мне сказать, но я действительно не знаю, что представляет каждый из этих процентов (Stmts, Branch, Funcs, Lines). До сих пор в Google мне не удалось найти надежного объяснения / ресурса.

Вопрос : Как я уже сказал, я понял суть, но может ли кто-нибудь опубликовать правильное объяснение или ссылку на правильное объяснение?

Третичный вопрос : есть ли способ определить, какие конкретные части вашего кода не охвачены? Пока, не вдаваясь в подробности этого отчета, я в основном предполагаю.

-------------------|-----------|-----------|-----------|-----------|
File               |   % Stmts |% Branches |   % Funcs |   % Lines |
-------------------|-----------|-----------|-----------|-----------|
   controllers/    |      88.1 |     77.78 |     78.57 |      88.1 |
      dashboard.js |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
All files          |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
Скотт меч
источник
3
Запуск istanbul должен также создать HTML-файл для отчета (должен находиться в папке покрытия). Этот HTML-код должен предоставлять вам подробную информацию, когда вы нажимаете на файлы / папки
Ярон Швиммер
Спасибо @yarons. Это определенно помогает углубиться в охват и определить, что конкретно не покрывается. Я до сих пор не очень понимаю , в глубине , что проценты означают = /.
Scott Sword

Ответы:

217

Существует ряд критериев покрытия, основными из которых являются:

  • Охват функций Была ли вызвана каждая функция (или подпрограмма) в программе?
  • Покрытие операторов Выполнялись ли все операторы в программе?
  • Охват ветвлений Выполнялась ли каждая ветвь (также называемая DD-путем) каждой управляющей структуры (например, в операторах if и case)? Например, для данного оператора if были выполнены как истинная, так и ложная ветви? Другой способ сказать это: все ли ребра в программе выполнены?
  • Покрытие строк. Каждая исполняемая строка в исходном файле была выполнена?

Для каждого случая процент представляет собой выполненный код по сравнению с невыполненным кодом , что соответствует каждой доле в процентном формате (например: 50% ветвей, 1/2).

В файле отчета:

  • 'E' означает «путь else не принят», что означает, что для отмеченного оператора if / else путь «if» был протестирован, но не путь «else».
  • 'I' означает «если путь не выбран», что является противоположным случаем: «если» не проверялось.
  • В xNлевом столбце указано количество выполнений этой строки.
  • Неисполненные строки или фрагменты кода будут выделены красным цветом.

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

Он также предоставляет несколько цветовых кодов -

Розовый : заявления не включены.

Оранжевый : функции не рассматриваются.

Желтый : ветви не прикрыты.

Полная документация по Стамбулу здесь:

https://istanbul.js.org

Для более углубленной теории покрытия кода:

https://en.wikipedia.org/wiki/Code_coverage

Надеюсь, поможет!

Эми Пеллегрини
источник
8

Запуск istanbul должен также создать HTML-файл для отчета (должен находиться в папке покрытия). Этот HTML-код должен предоставлять вам подробную информацию, когда вы нажимаете на файлы / папки.

Процент охваченных функций рассчитывается путем деления количества функций, вызванных во время тестов, на общее количество функций. То же самое касается строк и операторов (которые обычно будут близки друг к другу, если у вас нет очень длинных операторов). Ветви означают точки принятия решений, такие как if-elseблоки. Например, предположим, что ваш код содержит только один if-elseоператор, и ваши тесты проходят только через ifчасть, но не через elseчасть, тогда процент ваших ветвей должен быть 50%.

Надеюсь, это проясняет ситуацию.

Ярон Швиммер
источник
Я управлял istanbul, указав "test" : "nyc mocha"в package.json. Моя папка покрытия пуста. Мысли?
TheCrazyProgrammer
1
Я добавил html репортер. Теперь это работает. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer
В качестве примера: если у вас есть большая if-ветка и крошечная else-ветка, и была запущена только if-ветка, покрытие строки будет выглядеть отлично, но покрытие ветки все равно будет только 50%. Кроме того, у вас может быть несколько операторов в строке, если операторы разделены точкой с запятой или если строка включает определение функции (которое содержит свои собственные операторы). У вас может быть несколько строк на оператор, если в операторе есть разрывы строк перед последней точкой с запятой.
Hew Wolff,
0

Добавление к предыдущим ответам

% Утверждений рассчитывается путем взятия процента от количества утверждений, охваченных вашим тестом, например, 12/18 * 100 = 66,67%. Это означает, что ваш тест охватил только 66,67%.

Таким же образом рассчитывается% Branch. То же самое для ваших функций% и строк%.

В корневом каталоге вашего проекта есть папка покрытия, содержащая HTML-вывод вашего теста. Щелкните по нему и просмотрите в браузере. Вы должны увидеть что-то вроде этого

Изображение, показывающее результат вашего теста

Надеюсь, это поможет вам лучше понять это.

Самуэль Пиньейро
источник