空手道:在 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" }

参考:Type Conversion

对于 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。

这里有一些参考资料: