当我调用一个特征文件进行测试清理时,我的行为很奇怪。清理功能文件被正确调用,因为我可以从文件的背景部分看到打印,但由于某种原因,场景大纲的执行挂起。
我尝试过使用Junit5运行器运行功能,也在IntelliJIDE通过右键单击功能文件,但得到相同的问题,执行挂起。
这是我的主要功能文件:
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 |
执行在场景大纲处停止。我可以在控制台中看到DynamicData
变量的打印值,但之后没有发生任何事情。
似乎大纲循环未启动或已崩溃?无法从日志中获取详细信息,因为测试尚未完成或没有报告错误。我还可以检查什么或可能是什么问题?
如果不容易重现,您推荐什么测试清理解决方法?
目前,我已经完成了以下解决方法,在具有测试的功能的末尾添加了一个测试清理场景。已经停止了这些测试的并行执行,老实说,我不介意这些测试不并行运行,因为它们无论如何都运行得很快。
要删除的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
是的,我个人推荐一种总是预先清理的策略,因为你不能保证调用“之后”钩子,例如,如果机器关闭。
有时最简单的选择是在您的JUnit测试套件中作为普通的旧Java代码来执行此操作。所以在使用Runner
之后,也许一行就足够了。
如果您需要跟踪测试创建的动态数据,这会变得很棘手。我要做的是编写一个Java单例,在您的测试中使用它来“收集”需要删除的ID,然后在您的JUnit类中使用它。您可以使用@AfterClass
之类的东西。
请尝试使用此处的说明进行复制:https://github.com/intuit/karate/wiki/How-to-Submit-an-Issue-因为这确实可能是场景大纲
的bug。
最后,您可以评估ExecutionHook
,它有一个后Suite()
回调:https://github.com/intuit/karate/issues/970#issuecomment-557443551
编辑:在1.0中-它已成为RuntimeHook
:https://github.com/intuit/karate/wiki/1.0-upgrade-guide#hooks