【问题标题】:Karate: Convert string to karate native variable in javascript空手道:在javascript中将字符串转换为空手道本机变量
【发布时间】: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


    【解决方案1】:

    不久前,我整理了一个可以用来在空手道中测试 Kafka 的东西。请看看https://github.com/Sdaas/karate-kafka 是否有帮助。如果对您有帮助,我们很乐意增强/改进。

    【讨论】:

    • 您好@sdaas,感谢您的反馈!我浏览了自述文件,非常有趣!你还在用kafka积极测试吗?我做了类似的东西,但只有引导服务器是可配置的。然而,在消费者方面,我一直在尝试实现以下内容,但仍在不断发展。如果你在空手道松弛给我留言! confluent.io/blog/testing-event-driven-systems
    • 对不起@KonstantinosKollias,离开了一段时间,没有看到这个。我再次重新启动了 karate-kafka 的开发(上面的相同链接)。是的,我在空手道松弛 - 会给你一个便条。
    【解决方案2】:

    你可以试试,

    * 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)
    

    【讨论】:

    • 你好@Babu,谢谢你的回复,我想在一个javascript函数中实现这个。我上传了一个简化示例来展示我的问题:github.com/KostasKgr/karate-issues/blob/java_json_interop/src/…
    • 是否可以更改您的KafkaLib.getRecords 并返回List<Map> 而不是List<String>
    • 你好,Babu,我们不知道记录是什么,例如在某些情况下,它们将是 json,而在其他情况下是 xml。我们的 java 消费者代码不知道具体细节,所以只是读取为字符串以便能够正常工作。当工程师测试特定案例时,他们会知道更多,他们可以使用这些知识来编写过滤器及其匹配和断言。还试图使语法尽可能简单,以便我们组织中的更多人可以做出贡献
    • 也许我们可以尝试在 java 类中添加更多方法,例如getRecordsAsJson、getRecordsAsXml,并将我们想要的类型传递给可重用的consume.feature(假设主题中的消息是同质的,这听起来很公平)。但是,如果我们可以重用 def X = ... 用于派生类型的逻辑,似乎更可取。我需要尝试上述方法,看看它作为 DSL 的感觉如何,以及它是否有效
    • @KonstantinosKollias 的空手道开发者 - 我愿意添加一些 JS 助手。空手道的逻辑非常简单 - 如果它以 < 开头,它是 XML,如果是 {[,它是 JSON。你是对的,现有的逻辑偏向于非 JS(DSL / Gherkin)方面。我已经打开了一个增强请求 - 随时在这里权衡:github.com/intuit/karate/issues/1202
    【解决方案3】:

    正如另一个答案的 cmets 中提到的,现在有一个关于空手道的增强票,以实现该线程中讨论的内容,请参阅 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

    【讨论】:

      【解决方案4】:

      由于空手道对 Java 互操作的支持,您可以轻松编写一些“胶水”代码来将现有的 Kafka 系统连接到空手道测试套件,请参见下面的第一个链接。

      以下是一些参考资料:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多