Гарантирует ли coverage 100% отсутствие runtime error? Нет
Abap Unit-test являются полезным и мощным функционалом, улучшающим стабильность разработок. В данной заметке я хотел бы показать одну из особенностей подсчета coverage при IF, а именно, что в coverage считается как выполнение условия, так и его отрицание (независимо от того есть ли ELSE или нет), но динамические типы не учитываются.
Рассмотрим пример: у нас есть такой метод.
Обратите внимание: есть ветвистая логика на основе IF (без ELSE)
METHOD coverage_for_if_no_else. "IMPORTING !iv_status_in TYPE string. DATA lv_status_in TYPE string VALUE '10'. IF iv_status_in EQ lv_status_in. MESSAGE s000(cl) INTO sy-msgli. ENDIF. ENDMETHOD.
Код-Листинг 1 Метод для покрытия тестами с ветвистой логикой
Покроем этот метод unit-test (пример ниже).
Unit-test для метода coverage_for_if_no_else
METHOD ut_simple_if_no_else. DATA lv_status TYPE string VALUE '10'. DATA lv_res TYPE sysubrc. mo_cut->coverage_for_if_no_else( iv_status_in = lv_status ). ENDMETHOD.
Код-Листинг 2 Unit-test для метода coverage_for_if_no_else
Теперь посчитаем coverage-метрики (покрытие) для branch (по сути строк).
Рис. 1 Запуск unit-test в ручном режиме с подсчётом coverage
Система покажет метрику 2/3, а не 100%.
Рис. 2 Анализ coverage-metrics в SAP GUI
При этом подсветка будет полностью «зеленая» (если щёлкнем по методу дважды).
Рис. 3 Анализ branch-coverage построчно в SAP GUI
Причина в том, что в unit-test указан случай, когда условие в IF принимает истинное значение, но при этом в unit-test нет условия, когда бы IF наоборот не должен был отрабатывать. И поэтому это не 100%-coverage. Давайте дополним unit-test, чтобы coverage метода был 100%.
Unit-test для метода coverage_for_if_no_else с покрытием условия, когда IF не выполняется.
METHOD ut_simple_if_no_else. DATA lv_status TYPE string VALUE '10'. DATA lv_res TYPE sysubrc. mo_cut->coverage_for_if_no_else( iv_status_in = lv_status ). " from 66 to 100 lv_status = '20'. mo_cut->coverage_for_if_no_else( iv_status_in = lv_status ). ENDMETHOD.
Код-Листинг 3 Unit-test для метода coverage_for_if_no_else с покрытием условия, когда IF не выполняется.
Теперь целевой метод имеет 100%-coverage.
Рис. 4 Убеждаемся, что coverage 100%
При этом обратим внимание, что подсветка осталась такая же, как и была.
Рис. 5 Убеждаемся, что построчно тоже все покрыто и нет "красных" branch
На всякий случай обращу внимание, что в eclipse ADT – такая же метрика и подсветка.
Рис. 6 Проверяем, что в eclipse ADT аналогичная ситуация
Казалось бы, все хорошо: наш метод покрыт 100%. Но даёт ли 100% отсутствие хотя бы от runtime error?
Давайте рассмотрим другой пример с динамической типизацией.
Метод по анализу статуса.
METHOD compare_status. * IMPORTING !iv_status_in TYPE string * EXPORTING !ev_res TYPE sysubrc. IF iv_status_in
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти