字符串比较不匹配,但 'contains' 匹配
string comparison does not match but 'contains' does
我在使用 groovy 时遇到了一个奇怪的问题,我找到了一个解决方法,但我不太满意,所以也许有人能帮助我:
我使用 ReadyAPI 2.8。在我的测试用例中,我有 groovy 个步骤。
在其中一个中,我从之前的测试步骤中恢复了一个字符串,如果它与字符串 "TJA470" 匹配,我想做一个特定的处理。前面的测试步骤给出了一个字符串,它是 ssh 命令的输出。
这是 groovy 步骤代码:
def hbox_ref = context.expand( '${get current HBox reference#hbox_ref}' )
// this returns me the data as a String
log.info hbox_ref
log.info "\"$hbox_ref\"" // to check if there is no spurious blank
log.info hbox_ref.class
log.info (hbox_ref == "TJA470") => returns false
log.info (hbox_ref.equals("TJA470")) => returns false
log.info (hbox_ref.contains("TJA470")) => returns true
这是控制台结果:
Fri Sep 20 16:13:17 CEST 2019: INFO: TJA470
Fri Sep 20 16:13:17 CEST 2019: INFO: "TJA470
"
Fri Sep 20 16:13:17 CEST 2019: INFO: class java.lang.String
Fri Sep 20 16:13:17 CEST 2019: INFO: false
Fri Sep 20 16:13:17 CEST 2019: INFO: false
Fri Sep 20 16:13:17 CEST 2019: INFO: true
直截了当的测试是 == 或等于,尽管存在差异,但我在所有其他相同类型的比较中使用它们并且有效。
正如您在这里看到的大多数逻辑案例 return 错误,我真的不知道为什么。
如果我在像 'groovy playground' 这样的工具中执行相同的脚本,它会按预期工作! :(
我根本不是 groovy 方面的专家,一定有我遗漏的地方,但我发现它非常棘手!
如果有人能帮忙...
谢谢
感谢 SO 我发现了问题:
with copy/pasting 问题中的console return,说明文末有一个特殊字符。这在 SOAPUI 日志输出中不可见......
我在脚本中添加了以下处理:
def hbox_ref = context.expand( '${get current HBox reference#hbox_ref}' )
hbox_ref = hbox_ref.replaceAll("[^a-zA-Z0-9]+","")
或
hbox_ref = hbox_ref.replaceAll("[^\w]+","")
这给出
log.info (hbox_ref == "TJA470") => returns true (at last !)
更优雅的解决方案(感谢 SiKing):
(hbox_ref.trim() == "TJA470")
而不是使用 replaceAll
我在使用 groovy 时遇到了一个奇怪的问题,我找到了一个解决方法,但我不太满意,所以也许有人能帮助我:
我使用 ReadyAPI 2.8。在我的测试用例中,我有 groovy 个步骤。 在其中一个中,我从之前的测试步骤中恢复了一个字符串,如果它与字符串 "TJA470" 匹配,我想做一个特定的处理。前面的测试步骤给出了一个字符串,它是 ssh 命令的输出。
这是 groovy 步骤代码:
def hbox_ref = context.expand( '${get current HBox reference#hbox_ref}' )
// this returns me the data as a String
log.info hbox_ref
log.info "\"$hbox_ref\"" // to check if there is no spurious blank
log.info hbox_ref.class
log.info (hbox_ref == "TJA470") => returns false
log.info (hbox_ref.equals("TJA470")) => returns false
log.info (hbox_ref.contains("TJA470")) => returns true
这是控制台结果:
Fri Sep 20 16:13:17 CEST 2019: INFO: TJA470
Fri Sep 20 16:13:17 CEST 2019: INFO: "TJA470
"
Fri Sep 20 16:13:17 CEST 2019: INFO: class java.lang.String
Fri Sep 20 16:13:17 CEST 2019: INFO: false
Fri Sep 20 16:13:17 CEST 2019: INFO: false
Fri Sep 20 16:13:17 CEST 2019: INFO: true
直截了当的测试是 == 或等于,尽管存在差异,但我在所有其他相同类型的比较中使用它们并且有效。
正如您在这里看到的大多数逻辑案例 return 错误,我真的不知道为什么。
如果我在像 'groovy playground' 这样的工具中执行相同的脚本,它会按预期工作! :(
我根本不是 groovy 方面的专家,一定有我遗漏的地方,但我发现它非常棘手!
如果有人能帮忙... 谢谢
感谢 SO 我发现了问题: with copy/pasting 问题中的console return,说明文末有一个特殊字符。这在 SOAPUI 日志输出中不可见...... 我在脚本中添加了以下处理:
def hbox_ref = context.expand( '${get current HBox reference#hbox_ref}' )
hbox_ref = hbox_ref.replaceAll("[^a-zA-Z0-9]+","")
或
hbox_ref = hbox_ref.replaceAll("[^\w]+","")
这给出
log.info (hbox_ref == "TJA470") => returns true (at last !)
更优雅的解决方案(感谢 SiKing):
(hbox_ref.trim() == "TJA470")
而不是使用 replaceAll