【发布时间】:2020-06-29 11:04:19
【问题描述】:
我们的测试自动化需要与 kafka 交互,我们正在研究如何通过空手道实现这一目标。
我们有一个 java 类,它从 kafka 中读取数据并将记录放入一个内部列表中。然后我们从空手道请求这些记录,从后台流量中过滤掉所有消息,并返回与我们的过滤器匹配的第一条消息。
所以我们的消费者看起来像这样(简化):
// 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 }
有没有办法在 javascript 中将字符串转换为原生空手道变量?查看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
非常感谢
【问题讨论】:
标签: apache-kafka automated-tests karate