Karate 动态场景在使用afterFeature钩子调用时冻结

Karate 动态场景在使用afterFeature钩子调用时冻结,karate,Karate,当我使用afterfeaturehook调用一个特性文件进行测试清理时,会出现奇怪的行为。清理功能文件被正确调用,因为我可以看到文件的后台打印部分,但由于某些原因,场景大纲的执行会挂起 我尝试过用Junit5 runner运行该特性,也尝试过在IntelliJ IDE中右键单击该特性文件,但遇到了相同的问题,即执行挂起 这是我的主要功能文件: Feature: To test afterFeature hook Background: * def num1 = 100 *

当我使用afterfeaturehook调用一个特性文件进行测试清理时,会出现奇怪的行为。清理功能文件被正确调用,因为我可以看到文件的后台打印部分,但由于某些原因,场景大纲的执行会挂起

我尝试过用Junit5 runner运行该特性,也尝试过在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'

@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 |
后特征文件:

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'

@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 |
@忽略
功能:在调用功能运行完成后调用
背景:
*def dynamicData=dataForAfterFeature
*打印“dynamicATA:”+dynamicATA
场景大纲:打印动态数据
*打印id为的“从后”功能“+
示例:
|动态CDATA|
执行在场景大纲处暂停。我可以在控制台中看到
dynamicData
变量的打印值,但之后什么也没有发生

大纲循环似乎没有启动或已崩溃?无法从日志中获取详细信息,因为测试尚未完成或未报告错误。我还可以检查什么,或者可能有什么问题


如果不容易复制,您建议什么样的测试清理解决方法?

是的,我个人建议始终使用预清理策略,因为您无法保证调用“后”挂钩,例如,如果机器关闭

有时候,最简单的选择是在JUnit测试套件中作为普通的旧Java代码来完成这项工作。因此,在使用
Runner
之后只需一行就足够了

如果您需要跟踪您的测试所创建的动态数据,那么这会变得很棘手。我要做的是编写一个Java单例,在测试中使用它“收集”需要删除的ID,然后在JUnit类中使用它。你可以使用这样的东西

请尝试使用此处的说明进行复制:-因为这确实可能是
场景大纲
中的错误

最后,您可以评估具有
afterSuite()
回调的
ExecutionHook


编辑:在1.0中-它已成为
RuntimeHook

是的,我个人建议一种策略,始终进行预清理,因为您无法保证调用“after”hook,例如,如果机器关闭

有时候,最简单的选择是在JUnit测试套件中作为普通的旧Java代码来完成这项工作。因此,在使用
Runner
之后只需一行就足够了

如果您需要跟踪您的测试所创建的动态数据,那么这会变得很棘手。我要做的是编写一个Java单例,在测试中使用它“收集”需要删除的ID,然后在JUnit类中使用它。你可以使用这样的东西

请尝试使用此处的说明进行复制:-因为这确实可能是
场景大纲
中的错误

最后,您可以评估具有
afterSuite()
回调的
ExecutionHook


编辑:在1.0中-它已成为
RuntimeHook

目前,我已经完成了以下工作,在测试功能的末尾添加了测试清理场景。我已经停止了这些测试的并行执行,老实说,我不介意这些测试不并行运行,因为它们无论如何运行起来都很快

要删除的ID:

* 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)
调用删除测试数据场景,并向其传递需要删除的ID列表

删除测试数据功能:

Feature: To delete test data

  Background:
    * def idVal = id

  Scenario: Delete 
    Given path 'tests', 'delete', idVal
    Then method delete

现在,我已经完成了以下工作,在测试功能的末尾添加了一个测试清理场景。我已经停止了这些测试的并行执行,老实说,我不介意这些测试不并行运行,因为它们无论如何运行起来都很快

要删除的ID:

* 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)
调用删除测试数据场景,并向其传递需要删除的ID列表

删除测试数据功能:

Feature: To delete test data

  Background:
    * def idVal = id

  Scenario: Delete 
    Given path 'tests', 'delete', idVal
    Then method delete

我会尝试其他选择。目前已实施解决方案。我将尝试其他选项。目前已经实施了一个解决方案。