- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在空手道版本 0.9.5 中,我能够在模拟调用期间使用 System.setProperty('message', message)。然后该属性在使用 karate.properties['message'] 的功能中可用。我已经升级到 1.0.1 版,现在 karate.properties['message'] 的结果是 undefined
Spock 测试代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ApiTestRunnerSpec extends Specification {
@LocalServerPort
private int port
@SpringBean
MessageLogger messageLogger = Mock()
def "setup"() {
System.out.println("Running on port: " + port)
System.setProperty("server.port", "" + port)
}
def "Run Mock ApiTest"() {
given:
System.setProperty('foo', 'bar')
when:
Results results = Runner.path("classpath:").tags("~@ignore").parallel(5)
then:
results != null
1 * messageLogger.logMessage(_ as String) >> { String message ->
assert message != null
System.setProperty("message", message)
}
}
}
Controller
@RestController
public class MessageController {
@Autowired private MessageLogger messageLogger;
@GetMapping("/message")
public String message() {
String message = "Important Message";
messageLogger.logMessage(message);
return message;
}
}
消息记录器
@Component
public class MessageLogger {
public void logMessage(String message) {
System.out.println(message);
}
}
空手道-config.js
function fn() {
karate.configure('connectTimeout', 10000);
karate.configure('readTimeout', 10000);
karate.configure('ssl', true);
var config = {
localUrl: 'http://localhost:' + java.lang.System.getProperty('server.port'),
};
print('localUrl::::::::::', config.localUrl);
return config;
}
特征
@mockMessage
@parallel=true
Feature: Test Message
Background:
* url localUrl
Scenario: GET
Given path '/message'
When method get
Then status 200
* print 'foo value ' + karate.properties['foo']
* print 'message value ' + karate.properties['message']
0.9.5
2021-04-28 15:07:51.819 (...) [print] **foo value bar**
2021-04-28 15:07:51.826 (...) [print] **message value Important Message**
1.0.1
2021-04-28 14:36:58.566 (...) [print] **foo value bar**
2021-04-28 14:36:58.580 (...) [print] **message value undefined**
Link to project on github
最佳答案
我克隆了你的项目并注意到一些过时的东西(Groovy、Spock 和 GMaven+ 版本)。升级它们并没有改变结果,我仍然可以重现您的问题。
A 还注意到,在您的两个分支中,POM 的不同不仅在于空手道版本号,而且依赖项也不同。如果我使用 1.0.1 分支中的那些,则测试不再在 0.9.5 下工作。所以我 fork 了你的项目并向你发送了每个分支的两个拉取请求,并且两个空手道版本的依赖设置都相同。现在分支实际上只是在空手道版本号上有所不同:
https://github.com/kriegaex/spock-karate-example/compare/karate-0.9.5...kriegaex:karate-1.0.1
顺便说一句,由于某种原因,我不得不编译运行 JDK 11 的代码,但 JDK 16 不起作用。 GMaven+ 提示 Java 16 groovy 类文件(字节码版本 60.0),尽管 GMaven+ 应该使用目标级别 11。不知道这是关于什么的。无论如何,在 Java 11 上,我可以重现您的问题。由于两个分支的 Spock 版本相同,我想问题出在空手道本身。我建议在那里打开一个问题,链接到你的 GitHub 项目(在你接受我的 PR 之后)。 Spock 肯定设置了系统属性,我在 stub 关闭命令中添加了更多日志输出以验证这一点。也许这是关于空手道如何以及何时与 Spock 交流的问题。
更新: Peter Thomas 在他的回答中建议将要传输到该功能的值存储在一个 Java 对象中,并在 Spock 测试设置它之后从该功能访问该值。我想,他的意思是这样的:
https://github.com/kriegaex/spock-karate-example/commit/ca88e3da
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ApiTestRunnerSpec extends Specification {
@LocalServerPort
private int port
@SpringBean
MessageLogger messageLogger = Mock() {
1 * logMessage(_ as String) >> { String message ->
assert message != null
MessageHolder.INSTANCE.message = message
}
}
def "setup"() {
System.out.println("Running on port: " + port)
System.setProperty("server.port", "" + port)
}
def "Run Mock ApiTest"() {
given:
Results results = Runner
.path("classpath:")
.systemProperty("foo", "bar")
.tags("~@ignore")
.parallel(5)
expect:
results
}
static class MessageHolder {
public static final MessageHolder INSTANCE = new MessageHolder()
private String message
private MessageHolder() {}
String getMessage() {
return message
}
void setMessage(String message) {
this.message = message
}
}
}
@mockMessage
@parallel=true
Feature: Test Message
Background:
* url localUrl
Scenario: GET
Given path '/message'
When method get
Then status 200
* print 'foo value ' + karate.properties['foo']
* def getMessage =
"""
function() {
var MessageHolder = Java.type('com.example.spock.karate.ApiTestRunnerSpec.MessageHolder');
return MessageHolder.INSTANCE.getMessage();
}
"""
* def message = call getMessage {}
* print 'message value ' + message
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ApiTestRunnerSpec extends Specification {
@LocalServerPort
private int port
@SpringBean
MessageLogger messageLogger = Mock() {
1 * logMessage(_ as String) >> { String message ->
assert message != null
System.setProperty('message', message)
}
}
def "setup"() {
System.out.println("Running on port: " + port)
System.setProperty("server.port", "" + port)
}
def "Run Mock ApiTest"() {
expect:
Runner.path("classpath:").systemProperty("foo", "bar").tags("~@ignore").parallel(5)
}
}
唯一重要的变化是空手道功能:
@mockMessage
@parallel=true
Feature: Test Message
Background:
* url localUrl
Scenario: GET
Given path '/message'
When method get
Then status 200
* print 'foo value ' + karate.properties['foo']
* def getMessage = function() { return Java.type('java.lang.System').getProperty('message'); }
* print 'message value ' + getMessage()
关于karate - 从 Spock 运行 Karate(1.0.1) 测试时,在模拟中设置的系统属性最终在 karate.properties ['message' 中未定义],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67307301/
在使用 karate map 比较 XML 和 JSON 响应时,如果我在代码下方运行,我得到,TypeError: karate.map is not a function。这和我之前的questi
这个问题在这里已经有了答案: Karate framework retry until not working as expected (1 个回答) 去年关闭。 Karate 测试框架中的重试机制
我需要对 JSON 响应的结果执行两个操作。所以我们可以在单个 JS 文件中进行这些不同的操作吗?或者我们是否需要像一个 JS 文件那样为一项操作进行映射。 请帮忙解决这个问题 最佳答案 我不建议尝试
我需要在 URL 中传递多个同名的查询参数,但在让它与 Karate 一起使用时遇到问题。就我而言,URL 应如下所示: http://mytestapi.com/v1/orders?sort=ord
我需要在 URL 中传递多个同名的查询参数,但在让它与 Karate 一起使用时遇到问题。就我而言,URL 应如下所示: http://mytestapi.com/v1/orders?sort=ord
这个问题在这里已经有了答案: Tag logic for Parallel Run (1 个回答) 关闭 1 年前。 我有一个端到端的测试套件,其功能标有@e2e 标签。这些功能位于不同的模块中,即
这个问题在这里已经有了答案: Calling feature file with multiple arguments (1 个回答) 关闭 1 年前。 我正在将参数传递给 karate.call,
将 karate 配置为在任何场景失败时停止执行的最佳方法是什么? 我看到了 karate.abort() 但我认为它只会中止该特定场景。 我想中止整个特征文件的执行。 最佳答案 目前还不支持。直到现
任何人都可以帮助我重新运行 Karate 中失败的功能。下面是用于并行的 cucumber 选项和运行器测试 - @CucumberOptions(features = "classpath:feat
目标:匹配 check 值对于 API 中的 123S 和 123O 响应是正确的 首先检查此位置 x.details[0].user.school.name[0].codeable.text 的值是
为了测试我运行的 Karate 中的特定功能: mvn test -Dkarate.options="classpath:myfeature.feature" 有没有办法运行定义到功能中的单个场景?
我正准备用 Karate 进行一个小演示,我有以下 git 项目 https://github.com/TheRasanjana/karateTesting .我正在构建一个具有多种功能的测试套件。我
我正在点击 JIRA API 以根据周期名称获取周期 ID API : http://localhost:8080/rest/zapi/latest/cycle?projectId=78654&ver
我正在尝试编写一些空手道测试来检查某些预期结构的响应。例如,有一个看起来像这样的对象: { 'true|true':'disabled', 'true|false':'locked', '
使用以下测试用例 Background: * callonce read('auth.feature') * url java.lang.System.getenv('TEST_URL
我有一个像下面这样的对象数组。 "possibleValues": [ { "unitGroup": "A",
在空手道框架中执行功能文件时,将在模拟器中打开 Google URL。 但是由于以下原因,我得到的测试用例失败了: 17:49:10.459 [ForkJoinPool-1-worker-1] DEB
首先,感谢 build karate,它对测试 API 和 UI 非常有用。我们正在使用它来测试我们的许多端点,但我们想知道是否有一种方法或哪种方法是处理 header 中包含签名的请求的最佳方法。
我想使用 KARATE 框架的数据驱动功能为 JSON 中的某些元素动态设置值(从文件读取)。以下是更多详细信息: request.json -> { wheels : , color: '' } 功
我们可以通过在命令行中包含以下内容来选择多个场景:-Dcucumber.options="--tags @S1,@S2,@S6" 如果我想排除@S6,我可以:-Dcucumber.options="-
我是一名优秀的程序员,十分优秀!