【问题标题】:if statement not passing - groovy scriptingif 语句未通过 - groovy 脚本
【发布时间】:2025-11-21 07:05:02
【问题描述】:

我在通过特定条件时遇到问题。我正在显示来自 json 的值,正如您从屏幕截图中看到的那样,它在日志中显示值 2210,但是它输出条件为 fail 而它应该是 true。我看不出它为什么会失败,有没有人知道为什么或者我可以尝试修复它以使其通过?

下面是代码:

import groovy.json.JsonSlurper
def response = messageExchange.response.responseContent
def json =  new JsonSlurper().parseText(response)
def hotelidjson = json.jet2_hotel_id
hotelid = context.expand( '${#TestCase#hotelid}' )


assert hotelidjson != null

if (hotelidjson == "2210")
    log.info "pass"
else
    log.info "fail"


log.info hotelidjson

更新:

响应字符串输出:

INFO:[{jet2Awards=[], awards=[{awardType=Certificate of Excellence, images={small=https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_small-24283-5.jpg, large=https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_2016_en_US_large-24283-5.jpg}, year=2016}], num_reviews=342, rating_image_url=https://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.5-24283-5.png, jet2_hotel_id=2210, rating=4.5}]

响应的json在这里:

[{
   "rating": "4.5",
   "rating_image_url": "https://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.5-24283-5.png",
   "num_reviews": 342,
   "jet2_hotel_id": 2210,
   "awards": [   {
      "awardType": "Certificate of Excellence",
      "year": "2016",
      "images":       {
         "small": "https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_small-24283-5.jpg",
         "large": "https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_2016_en_US_large-24283-5.jpg"
      }
   }], 

谢谢

【问题讨论】:

  • 但是hotelidjson[2210] 而不是2210...您要检查字符串是否等于该值或包含该值?此外,日志与代码不一致,因为有 3 个值但只有 2 个失败。提供的代码不会发生这种情况。
  • (1) 请不要将代码或输出的屏幕截图放在问题中。而是复制/粘贴文本。它更易于阅读和使用。 (2) 注释掉的代码与您的问题无关,请不要包含它。
  • (3) 显示字符串response 的值(去掉不相关的元素)
  • @m0skit0 即使我更改 if 条件以检查 hoteldidjson = [2210],它也会失败.. 对于日志,我运行它并显示日志 3,然后我注释掉了一个的日志并没有清除它,因此为什么你在应该是 2 时看到 5 个日志
  • 你能告诉我们hotelidjson是什么吗? log.info hotelidjson.class

标签: json groovy soapui


【解决方案1】:

您正在测试"2210",但hotelidjson.toString()"[2210]",因此该对象绝对不是字符串"2210"

它实际上是什么,很难说。对于在 IDE 上大喊“println() 说它们是相同的,但 assertEquals() 说它们不是”的程序员来说,这是一个普遍的问题。但考虑到包含"Hello"List<String> 打印为["Hello"],而字符串"[\"Hello\"]" 也打印为["Hello"]

此外,此类的对象打印为["Hello"]

 class Hello {
       String toString() {
           "[\"Hello\"]"
       }
 }

因此,在假设给出相同println() 输出的两个对象实际上相等之前,您需要更加彻底。

最明智的做法是在调试器中运行测试。在断言之前放置一个断点,然后检查该点的变量。

如果您还不是习惯性的调试器用户,那么一个更愚蠢的选项是添加更多的诊断日志记录,但设置开销更少。例如log.info hotelidjson.getClass()

不过,我强烈建议养成使用调试器的习惯。它很快就会在节省的时间中得到回报。


更新,现在您已经展示了 JSON。我希望hotelidjson == 2210 能够通过。 2210"2210" 不相等,因为一个是数字,另一个是字符串。

(我注意到您在 cmets 中发现它是一个列表。我不知道为什么会这样。)

【讨论】:

  • 嗨 Slim,这是 json 的值
  • @1990prog 然后更新您的问题,使其准确无误。不要说“json”,而是说json,这样我们就知道您指的是代码中的变量(更好的是,给它一个更好的名字。现在它已经被解析了,它不再是 JSON。它是一个数据结构。)
【解决方案2】:

由于hotelidjson 实际上是一个列表而不是字符串([2210] 是列表的字符串表示形式),因此直接将其与字符串进行比较将始终返回 false。你可以这样做:

if (hotelidjson == [2210])

if (hotelidjson[0] == 2210)

你应该小心使用def

PS:感谢 slim 的提示;)

【讨论】: