Меню

Гарантирует ли 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

У вас уже есть учетная запись?

Войти