Как мы измеряем покрытие (coverage)?

4-12-2019

Когда Вы собираетесь достичь 100% покрытия, Вы озадачиваетесь вопросом - 100% от чего?

Чаще всего используют такие метрики:

  1. Процент ручных тестов покрытых автоматическими тестами
  2. Процент покрытых тестами фич (features)
  3. Процент покрытия кода

Процент ручных тестов покрытых автоматическими тестами

Например, когда Вы переносите ручные тесты в автоматические, то 100% покрытие будет означать полностью завершённый этот процесс. Однако тяжело оценить степень завершённости этого процесса по промежуточным данным, например 50%. Не все тесты подходят под автоматизацию, одни проще -другие сложнее. Кроме этого, для использования этой метрики мы должны предположить, что сценарии ручных тестов 100% покрывают тестируемый фукционал. А это не всегда так.

Процент покрытых тестами фич (features)

Как определить сколько фукционала системы покрыто ручными или автоматическим тестами? Даже если нам известен полный список фукционала и список связанных проверок с ним, то даже в этом случае нельзя четко говорить о покрытии, ибо каждый фукционал имеет свой определенный список тестов (который может быть не полным для проверки данного фукционала). Более того, а где гарантия что представленный список реализованного функционала соответсвует тому что разработано (закодировано)? Всегда будут "неучтённые" фичи. Более объективной метрикой является метрика- процент покрытия кода.

Процент покрытия кода

Почти каждый язык программирования в настоящее время имеет инструментарий, позволяющий проверять куски кода, на предмет - а была ли выполнена каждая строка кода в ходе выполнения тестов или нет. Иными словами, Вы запускаете этот инструмент, затем запускаете свои тесты и получаете отчёт о том, сколько строк кода было выполнено а сколько -нет. Эта техника известна как - покрытие кода и является довольно точной и объективной метрикой. Обычно считается, что она пригодна лишь для юнит тестов, однако, никто не мешает использовать его и в других тестах, хоть в ручных! Используя такие инструменты анализа кода, очень важной плюшкой является возможность обнаружения непокрытых тестами областей кода. В итоге мы можем добавить новые тесты для улучшения покрытия или удалять неиспользуемый код (мёртвый код). Получив 100% по такой метрике, мы получим серьёзную степень уверенности в том, что мы близки к свободному от багов состоянию :-) . Кроме этого, высокая степень покрытия кода предоставляет комфортные условия для рефакторинга и улучшения внутреннего качества кода. Конечно анализ строк кода будет зависеть от возможностей используемого инструмента, например одни проверяют только выполнение строк кода, другие в дополнение могут проверят условия, циклы и т.д.

И конечно, 100% покрытие тестами кода не гарантирует отсутствие багов!

В доказательство этого примите хотя бы во внимание факт того, что если все строки кода отработали это ведь не означает, что отработали все возможные варианты (например условий if). И к тожу же, иногда некоторые строки кода отработают лишь в некоторых специфических условиях, и порой очень сложно проверить эти специфические условия, а наш инструмент пометит такой код как мертвый ...

В общем как видно, все описанные тут метрики имеют свои плюсы и недостатки. Но всё же грубую оценку они могут всегда нам дать. Более того, в одном мы можем лишь согласиться:

  1. Всегда есть "щель" между текущим покрытием и 100%, нужно стараться минимизировать её (это может быть долгий путь)
  2. Даже если это займёт много времени- всегда нужно минимизировать этот разрыв между новыми фукциями и покрытыми тестами функциями и не увеличивать этот разрыв.

А что бы мы делали имея идеальные 100% покрытия кода?

Имея такое счастье мы бы всё равно не почивали бы на лаврах, ибо нам пришлось бы теперь работать в таких направлениях (чтобы сохранять 100% покрытие):

  1. Новые тесты должны создаваться под новые функции
  2. Каждое изменение, ломающее наши тесты, должно быть как можно быстрее исправлено (речь идет и о багах -которые нужно будет быстро чинить, и об изменениях в коде)

Короче говоря, достигнув 100% покрытия мы должны будем быть в состоянии добавлять тесты быстрее, чем мы добавляем новые функции, чтобы обеспечивать 100% покрытие всегда.

Литература

  1. "Complete Guide to Test Automation": Techniques, Practices, and Patterns for Building and Maintaining Effective Software Projects. Arnon Axelrod - 2018