空手道:在 javascript 中将字符串转换为空手道本机变量
Karate: Convert string to karate native variable in javascript
我们的测试自动化需要与 kafka 交互,我们正在研究如何使用 karate 实现这一点。
我们有一个 java class 从 kafka 读取并将记录放入内部列表中。然后我们从空手道请求这些记录,从后台流量中过滤掉所有消息,return 匹配我们过滤器的第一条消息。
所以我们的消费者看起来像这样(简化):
// consume.js
function(bootstrapServers, topic, filter, timeout, interval) {
var KafkaLib = Java.type('kafka.KafkaLib')
var records = KafkaLib.getRecords(bootstrapServers, topic)
for (record_id in records) {
// TODO here we want to convert record to a json (and later xml for xml records) so that
// we can access them as 'native' karate data types and use notation like: cat.cat.scores.score[1]
var record = records[record_id]
if (filter(record)) {
karate.log("Record matched: " + record)
return record
}
}
throw "No records found matching the filter: " + filter
}
记录可以是 json、xml 或纯文本,但现在查看 json 的情况。
在这种情况下,假设在 kafka 中有这样一条消息:
{"correlationId":"b3e6bbc7-e5a6-4b2a-a8f9-a0ddf435de67","text":"Hello world"}
这在上面的记录变量中作为字符串加载。
我们想将其转换为 json 以便像这样的过滤器可以工作:
* def uuid = java.util.UUID.randomUUID() + ''
# This is what we are publishing to kafka
* def payload = ({ correlationId: uuid, text: "Hello world" })
* def filter = function(m) { return m.correlationId == uuid }
有没有办法在 java 脚本中将字符串转换为原生空手道变量?可能在查看 https://intuit.github.io/karate/#the-karate-object 时错过了它。顺便说一下,var jsonRecord = karate.toJson(record)
不起作用,jsonRecord.uuid
未定义。
编辑:我在这里举了一个我想要实现的例子:
https://github.com/KostasKgr/karate-issues/blob/java_json_interop/src/test/java/examples/consumption/consumption.feature
非常感谢
你能试试吗,
* json payload = { correlationId: uuid, text: "Hello world" }
对于 javascript 内的类型转换,理想情况下 karate.toMap(object)
或 karate.toJson(object)
应该。
与其将所有内容都打包到一个 JS 函数中,我建议将记录调用部分保留在 JS 之外,让空手道施放它。
* json records = Java.type('kafka.KafkaLib').getRecords(bootstrapServers, topic)
* consume(records, filter, timeout, interval)
正如另一个答案的评论中所提到的,现在有一张关于空手道的增强票来实现这个帖子中讨论的内容,请参阅 https://github.com/intuit/karate/issues/1202
在此之前,我通过在 Java 中将字符串解析为 json 并将其返回给空手道,设法获得了关于 JSON 的大部分内容。
Map<String,Object> result = new ObjectMapper().readValue(record, HashMap.class);
不确定 xml
是否可以解决同样的问题
您可以在此处查看解决方法:
https://github.com/KostasKgr/karate-issues/blob/java_json_interop_v2/src/test/java/examples/consumption/consumption.feature
前段时间我整理了一些东西,可以用来在 Karate 中测试 Kafka。请查看 https://github.com/Sdaas/karate-kafka 是否有帮助。如果对您有帮助,很高兴加强/改进。
由于 Karate 支持 Java 互操作,您可以轻松编写一些“胶水”代码以将现有的 Kafka 系统连接到 Karate 测试套件,请参阅下面的第一个 link。
这里有一些参考资料:
- 如何使用Java互操作来监听和等待事件:https://twitter.com/KarateDSL/status/1417023536082812935
- 空手道 ActiveMQ 示例:https://github.com/intuit/karate/tree/master/karate-netty#consumer-provider-example
- 沃尔玛实验室博客 post(特定于 Kafka):https://medium.com/walmartglobaltech/kafka-automation-using-karate-6a129cfdc210
- 空手道卡夫卡(第 3 方项目/示例):https://github.com/Sdaas/karate-kafka
我们的测试自动化需要与 kafka 交互,我们正在研究如何使用 karate 实现这一点。
我们有一个 java class 从 kafka 读取并将记录放入内部列表中。然后我们从空手道请求这些记录,从后台流量中过滤掉所有消息,return 匹配我们过滤器的第一条消息。
所以我们的消费者看起来像这样(简化):
// consume.js
function(bootstrapServers, topic, filter, timeout, interval) {
var KafkaLib = Java.type('kafka.KafkaLib')
var records = KafkaLib.getRecords(bootstrapServers, topic)
for (record_id in records) {
// TODO here we want to convert record to a json (and later xml for xml records) so that
// we can access them as 'native' karate data types and use notation like: cat.cat.scores.score[1]
var record = records[record_id]
if (filter(record)) {
karate.log("Record matched: " + record)
return record
}
}
throw "No records found matching the filter: " + filter
}
记录可以是 json、xml 或纯文本,但现在查看 json 的情况。
在这种情况下,假设在 kafka 中有这样一条消息:
{"correlationId":"b3e6bbc7-e5a6-4b2a-a8f9-a0ddf435de67","text":"Hello world"}
这在上面的记录变量中作为字符串加载。
我们想将其转换为 json 以便像这样的过滤器可以工作:
* def uuid = java.util.UUID.randomUUID() + ''
# This is what we are publishing to kafka
* def payload = ({ correlationId: uuid, text: "Hello world" })
* def filter = function(m) { return m.correlationId == uuid }
有没有办法在 java 脚本中将字符串转换为原生空手道变量?可能在查看 https://intuit.github.io/karate/#the-karate-object 时错过了它。顺便说一下,var jsonRecord = karate.toJson(record)
不起作用,jsonRecord.uuid
未定义。
编辑:我在这里举了一个我想要实现的例子: https://github.com/KostasKgr/karate-issues/blob/java_json_interop/src/test/java/examples/consumption/consumption.feature
非常感谢
你能试试吗,
* json payload = { correlationId: uuid, text: "Hello world" }
对于 javascript 内的类型转换,理想情况下 karate.toMap(object)
或 karate.toJson(object)
应该。
与其将所有内容都打包到一个 JS 函数中,我建议将记录调用部分保留在 JS 之外,让空手道施放它。
* json records = Java.type('kafka.KafkaLib').getRecords(bootstrapServers, topic)
* consume(records, filter, timeout, interval)
正如另一个答案的评论中所提到的,现在有一张关于空手道的增强票来实现这个帖子中讨论的内容,请参阅 https://github.com/intuit/karate/issues/1202
在此之前,我通过在 Java 中将字符串解析为 json 并将其返回给空手道,设法获得了关于 JSON 的大部分内容。
Map<String,Object> result = new ObjectMapper().readValue(record, HashMap.class);
不确定 xml
是否可以解决同样的问题您可以在此处查看解决方法: https://github.com/KostasKgr/karate-issues/blob/java_json_interop_v2/src/test/java/examples/consumption/consumption.feature
前段时间我整理了一些东西,可以用来在 Karate 中测试 Kafka。请查看 https://github.com/Sdaas/karate-kafka 是否有帮助。如果对您有帮助,很高兴加强/改进。
由于 Karate 支持 Java 互操作,您可以轻松编写一些“胶水”代码以将现有的 Kafka 系统连接到 Karate 测试套件,请参阅下面的第一个 link。
这里有一些参考资料:
- 如何使用Java互操作来监听和等待事件:https://twitter.com/KarateDSL/status/1417023536082812935
- 空手道 ActiveMQ 示例:https://github.com/intuit/karate/tree/master/karate-netty#consumer-provider-example
- 沃尔玛实验室博客 post(特定于 Kafka):https://medium.com/walmartglobaltech/kafka-automation-using-karate-6a129cfdc210
- 空手道卡夫卡(第 3 方项目/示例):https://github.com/Sdaas/karate-kafka