Покрытие кода и метрики тестирования
На прошлом занятии мы научились писать модульные тесты. Но как понять, что тестов достаточно? Может быть, мы проверили только 10% кода, а остальные 90% остались «в тени»?
Сегодня мы разберём покрытие кода (code coverage) — метрику, которая показывает, какая часть программы была выполнена во время тестирования. А также познакомимся с методом MC/DC, который используется в критически важных системах (авиация, медицина).
План лекции
Сегодня мы разберём, как измерять качество тестов и что такое «хорошее покрытие».
- 1 Проблема: «тесты есть, а толку нет»
- 2 Что такое покрытие кода
- 3 Покрытие по строкам (statement coverage)
- 4 Покрытие по ветвям (branch coverage)
- 5 Покрытие по условиям (condition coverage)
- 6 Покрытие MC/DC — «золотой стандарт»
- 7 Пример: как достичь 100% MC/DC
- 8 Анализ непокрытого кода
- 9 Метрики качества тестов
- 10 Типичные ошибки
- 11 Итоги и практика
Проблема: «тесты есть, а толку нет»
Представьте, что вы написали 100 тестов. Все они проходят успешно. Вы уверены, что программа работает правильно?
Что такое покрытие кода
Покрытие кода (code coverage) — это процент программного кода, который был выполнен во время тестирования.
Большая часть кода проверена. Меньше шансов на скрытые ошибки.
Много «слепых зон». Ошибки могут прятаться в непроверенном коде.
Покрытие по строкам
Покрытие по строкам (statement coverage) — простейший вид покрытия. Считает, сколько строк кода было выполнено.
Покрытие по ветвям
Покрытие по ветвям (branch coverage) — более строгий вид. Считает, сколько ветвей условных операторов было выполнено.
else — её тоже нужно проверить.Покрытие по условиям
Покрытие по условиям (condition coverage) — ещё более строгий вид. Считает, что каждая компонента логического выражения приняла все возможные значения (true и false).
Покрытие MC/DC — «золотой стандарт»
MC/DC (Modified Condition/Decision Coverage) — это самый строгий вид покрытия. Он используется в критически важных системах: авиации, медицине, космосе.
Пример: как достичь 100% MC/DC
Рассмотрим условие if (A || B). Построим тесты для MC/DC.
OR.Сравнение видов покрытия
Соберём все виды покрытия в одну таблицу.
Анализ непокрытого кода
Покрытие — это не только цифра. Важно понимать, какой код остался непокрытым и почему.
Метрики качества тестов
Покрытие — не единственная метрика. Есть и другие показатели, которые помогают оценить качество тестов.
Типичные ошибки новичков
Писать бессмысленные тесты, которые проверяют очевидное. Лучше 80% осмысленных, чем 100% бесполезных.
«У меня есть тесты, значит всё хорошо». Без покрытия вы не знаете, что именно проверено.
Покрытие не гарантирует отсутствие ошибок. Оно лишь показывает, что код был выполнен.
Важно понять, почему код не покрыт. Может, это «мёртвый» код, а может — важная функция.
Покрытие по строкам и по ветвям — это разные метрики. Нельзя сказать «у меня 100%», не уточнив, какое именно покрытие.
Практическое задание
Примените полученные знания на практике.
Задание 1
Для функции check_age(age) (см. слайд 3) составьте тесты так, чтобы покрытие по строкам было 100%.
Задание 2
Для условия if (a > 0 && b > 0) постройте тесты для покрытия по условиям и для MC/DC.
Задание 3
Объясните своими словами, чем покрытие по ветвям отличается от покрытия по условиям.
Шпаргалка
Сохраните этот слайд — здесь все основные понятия лекции.
Итоги лекции
Подведём итоги. Вот что вы теперь знаете.
- ✅ Покрытие кода — это процент кода, выполненного во время тестирования.
- ✅ Покрытие по строкам — самый простой вид. Не гарантирует проверку всех ветвей.
- ✅ Покрытие по ветвям — строже. Требует проверки всех ветвей условий.
- ✅ Покрытие по условиям — ещё строже. Требует проверки всех компонент логических выражений.
- ✅ MC/DC — «золотой стандарт». Требует независимого влияния каждой компоненты.
- ✅ Анализ непокрытого кода помогает найти «мёртвый» код и пробелы в тестах.
- ✅ 100% покрытие не гарантирует отсутствие ошибок. Но низкое покрытие — это сигнал тревоги.
Домашнее задание
Задания для самостоятельной работы. Первые два обязательны, остальные — для оценки «отлично».
- Для функции
check_age(age)постройте тесты для 100% покрытия по ветвям. - Для условия
if (a > 0 || b > 0)постройте тесты для MC/DC. - Объясните своими словами, почему 100% покрытие по строкам не гарантирует 100% покрытия по ветвям.
- Найдите в интернете пример «мёртвого кода» и объясните, почему он появляется.
- Попробуйте измерить покрытие своего проекта (если есть) с помощью инструментов (pytest-cov для Python).
Что дальше?
В этом блоке по тестированию у нас ещё несколько материалов.
- Лекция 5: отладка и инструменты разработчика.
- Практика 3: интеграционное тестирование.
- Практика 4: покрытие кода на Python (pytest-cov).
Спасибо за внимание!
📊
Покрытие — это компас, а не цель
Он показывает, куда двигаться. Но решение о том, что и как тестировать, всегда остаётся за вами.