Найти в Дзене
rustabapclub

Гарантирует ли coverage 100% отсутствие runtime error? Нет.

Abap Unit-test являются полезным и мощным функционалом, улучшающим стабильность разработок. В данной заметке я хотел бы показать одну из особенностей подсчета coverage при IF, а именно, что в coverage считается как выполнение условия, так и его отрицание (независимо от того есть ли ELSE или нет), но динамические типы не учитываются. Рассмотрим пример: у нас есть такой метод. Покроем этот метод unit-test (пример ниже). Теперь посчитаем coverage-метрики (покрытие) для branch (по сути строк). Система покажет метрику 2/3, а не 100%. При этом подсветка будет полностью «зеленая» (если щёлкнем по методу дважды). Причина в том, что в unit-test указан случай, когда условие в IF принимает истинное значение, но при этом в unit-test нет условия, когда бы IF наоборот не должен был отрабатывать. И поэтому это не 100%-coverage. Давайте дополним unit-test, чтобы coverage метода был 100%. Теперь целевой метод имеет 100%-coverage При этом обратим внимание, что подсветка осталась такая же, как и была. На

Abap Unit-test являются полезным и мощным функционалом, улучшающим стабильность разработок. В данной заметке я хотел бы показать одну из особенностей подсчета coverage при IF, а именно, что в coverage считается как выполнение условия, так и его отрицание (независимо от того есть ли ELSE или нет), но динамические типы не учитываются.

Рассмотрим пример: у нас есть такой метод.

Код-Листинг 1 Метод для покрытия тестами с ветвистой логикой
Код-Листинг 1 Метод для покрытия тестами с ветвистой логикой

Покроем этот метод unit-test (пример ниже).

Код-Листинг 2 Unit-test для метода coverage_for_if_no_else
Код-Листинг 2 Unit-test для метода coverage_for_if_no_else

Теперь посчитаем coverage-метрики (покрытие) для branch (по сути строк).

Рис. 1 Запуск unit-test в ручном режиме с подсчётом coverage
Рис. 1 Запуск unit-test в ручном режиме с подсчётом coverage

Система покажет метрику 2/3, а не 100%.

Рис. 2 Анализ coverage-metrics в SAP GUI
Рис. 2 Анализ coverage-metrics в SAP GUI

При этом подсветка будет полностью «зеленая» (если щёлкнем по методу дважды).

Рис. 3 Анализ branch-coverage построчно в SAP GUI
Рис. 3 Анализ branch-coverage построчно в SAP GUI

Причина в том, что в unit-test указан случай, когда условие в IF принимает истинное значение, но при этом в unit-test нет условия, когда бы IF наоборот не должен был отрабатывать. И поэтому это не 100%-coverage. Давайте дополним unit-test, чтобы coverage метода был 100%.

Код-Листинг 3 Unit-test для метода coverage_for_if_no_else с покрытием условия, когда IF не выполняется.
Код-Листинг 3 Unit-test для метода coverage_for_if_no_else с покрытием условия, когда IF не выполняется.

Теперь целевой метод имеет 100%-coverage

Рис. 4 Убеждаемся, что coverage 100%
Рис. 4 Убеждаемся, что coverage 100%

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

Рис. 5 Убеждаемся, что построчно тоже все покрыто и нет "красных" branch
Рис. 5 Убеждаемся, что построчно тоже все покрыто и нет "красных" branch

На всякий случай обращу внимание, что в eclipse ADT – такая же метрика и подсветка.

Рис. 6 Проверяем, что в eclipse ADT аналогичная ситуация
Рис. 6 Проверяем, что в eclipse ADT аналогичная ситуация

Казалось бы, все хорошо: наш метод покрыт 100%. Но даёт ли 100% отсутствие хотя бы от runtime error?

Давайте рассмотрим другой пример с динамической типизацией.

Код-Листинг 4 Анализируем статус через отдельный метод - целевой метод
Код-Листинг 4 Анализируем статус через отдельный метод - целевой метод

Покроем этот метод unit-test с coverage 100%.

Код-Листинг 5 unit-test для целевого метода по анализу статуса
Код-Листинг 5 unit-test для целевого метода по анализу статуса
Рис. 7 Убеждаемся, что coverage 100%
Рис. 7 Убеждаемся, что coverage 100%
Рис. 8 Проверяем branch coverage
Рис. 8 Проверяем branch coverage

А теперь зададимся вопросом: а что будет если в параметре iv_status_in (а он имеет тип string) будет подана буква ? Правильно, будет runtime error (с дампом) 😊

Вот пример вызова метода для получения runtime error.

Рис. 9 Вызов метода с параметром-буквой
Рис. 9 Вызов метода с параметром-буквой

Вот результат прогона unit-test.

Рис. 10 Получаем runtime error CONVT_NO_NUMBER
Рис. 10 Получаем runtime error CONVT_NO_NUMBER

Несмотря на такие ситуации, автор считает abap unit-test и другие виды тестирования очень мощным инструментом для разработки бизнес-решений и их нужно применять в своей практике, если хотите более качественно удовлетворять пользователей. В следующих статьях мы поговорим и про другие инструменты тестирования.

А какие у Вас интересные случаи возникали при прогонах тестирования? Вопрос про все виды тестирования: в unit-test, в функциональных, так и в E2E (от начала до конца) ?