Сценарий Dynami c зависает при вызове с использованием ловушки afterFeature - PullRequest
1 голос
/ 31 марта 2020

Странное поведение, когда я вызываю файл объектов для очистки теста с помощью ловушки afterFeature. Файл функции очистки вызывается правильно, потому что я вижу печать из раздела «Фон» файла, но по какой-то причине выполнение зависает для схемы сценария.

Я попытался запустить функцию с помощью Runit Junit5, а также в IntelliJ IDE, щелкнув правой кнопкой мыши по файлу функции, но у меня возникла та же проблема, выполнение зависает.

Это мой основной файл функций:

Feature: To test afterFeature hook

  Background:
    * def num1 = 100
    * def num2 = 200
    * def num3 = 300

    * def dataForAfterFeature =
    """
    [
      {"id":'#(num1)'},
      {"id":'#(num2)'},
      {"id":'#(num3)'}
    ]
    """
  * configure afterFeature = function(){ karate.call('after.feature'); }

  Scenario: Test 1
    * print 'Hello World 1'

  Scenario: Test 2
    * print 'Hello World 2'

Файл afterFeature:

@ignore

Feature: Called after calling feature run is completed

  Background:
    * def dynamicData = dataForAfterFeature
    * print 'dynamicData: ' + dynamicData

  Scenario Outline: Print dynamic data
    * print 'From after feature for id: ' + <id>

    Examples:
    | dynamicData |

Выполнение останавливается на схеме сценария. Я вижу напечатанное значение переменной dynamicData в консоли, но после этого ничего не происходит.

Похоже, контур l oop не запускается или сломался? Не удалось получить подробности из журнала, так как тест не завершен или нет сообщений об ошибках. Что еще я могу проверить или в чем может быть проблема?

Если это непросто воспроизвести, какой метод обхода теста вы рекомендуете?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

На данный момент я сделал следующий обходной путь, где я добавил сценарий очистки теста в конце функции, которая имеет тесты. Остановили параллельное выполнение этих тестов, и, честно говоря, я не против, чтобы эти тесты не работали параллельно, поскольку они все равно бывают быстрыми.

Идентификаторы для удаления:

* def idsToDelete =
    """
      [
        101,
        102,
        103
      ]
   """

Сценарий очистки теста:

# Test data clean-up scenario
  Scenario: Delete test data
    # Js method to call delete data feature.
    * def deleteTestDataFun =
    """
      function(x) {
        var temp = [x];
        // Call to feature. Pass argument as json object.
        karate.call('delete-test-data.feature', { id: temp });
      }
    """
    * karate.forEach(idsToDelete, deleteTestDataFun)

Вызывает сценарий удаления тестовых данных и передает ему список идентификаторов, которые должны быть удалено.

Удалить функцию проверки данных:

Feature: To delete test data

  Background:
    * def idVal = id

  Scenario: Delete 
    Given path 'tests', 'delete', idVal
    Then method delete
1 голос
/ 31 марта 2020

Да, я лично рекомендую стратегию предварительной очистки всегда, потому что вы не можете гарантировать, что будет вызван хук «после», например, если машина выключена.

Иногда самый простой вариант - это сделайте это как обычный старый Java код в вашем тестовом наборе JUnit. Так что, может быть, достаточно одной строки после использования Runner.

Это сложно, если вам нужно отслеживать динамические c данные, созданные вашими тестами. Я хотел бы написать Java singleton, использовать его в своих тестах для «сбора» идентификаторов, которые необходимо удалить, и затем использовать это в своем классе JUnit. Вы можете использовать такие вещи, как @AfterClass.

Пожалуйста, попробуйте и скопируйте, используя инструкции здесь: https://github.com/intuit/karate/wiki/How-to-Submit-an-Issue - потому что это действительно может быть ошибка с Scenario Outline.

Наконец, вы можете оценить ExecutionHook с обратным вызовом afterSuite(): https://github.com/intuit/karate/issues/970#issuecomment -557443551

...