SoapUI 和 Excel:空值与无值
SoapUI and Excel: empty values vs. no value
我正在使用 SoapUI Pro 4.5.2 从电子表格中读取数据,将它们放入对我的 Web 服务的 Soap 请求中,然后获取响应以写入电子表格。有效。
我在输入数据中有两个字段与我的问题相关:
中间名定义为 4 个字符的字符串,并且 minOccurs = 1 和 maxOccurs = 1。
邮政分机号(普通5位代码后可选的4位数字)定义为4位的字符串。该字段是可选的,因此标记为 minOccurs=0 和 maxOccurs=1.
当我使用 SoapUI UI 接口发送请求时,这工作正常;如果中间名没有值,SoapUI 生成一个空标签并发送它(我猜是因为 minOccurs=1)。如果 PostalCode 没有值,它根本不会发送任何标签(我猜是因为 minOccurs=0)。
但是,当 SoapUI 从 Excel 电子表格中读取数据时,对相同数据的响应是一个错误,表明 '' 的扩展邮政编码值不合法,因为它必须是 4 位数字。似乎 SoapUI 在从电子表格读取数据时为扩展邮政编码生成了一个空标签,并发送了它。
我找到了 SoapUI 请求的 "Remove Empty Content" 选项,默认为 false。我将其设置为 true,现在从验证中返回一个错误,指示需要中间名但未找到。我猜 remove empty content 删除了所有空内容(足够合理),中间名必须在那里,即使是空的,因为 minOccurs=1.
我有办法解决这个追尾问题吗?我想我正在寻找类似邮政扩展代码输出的条件,所以即使它是空的,我也可以删除它,即使从电子表格中读取值也是如此。
我也很好奇是否有 XSD 修复程序,但我非常喜欢不涉及更改 XSD 的修复程序——这会成为一个政治问题。
编辑细节:
将输入放入请求中:我已经使用 SoapUI UI 从输入电子表格中为每个输入字段选择 "properties";完成后,最终会在请求字段中得到值,例如:
${SpreadsheetInput#FrstNm}
其中 SpreadsheetInput 是读取电子表格的数据源步骤的名称,FrstNm 是属性之一。我通过右键单击请求输入字段获得的弹出菜单中的 "Get Data" 选项来执行此操作,但可能还有其他方法。
首先是你的问题:
请记住,在 SoapUI 内部 几乎 一切都是字符串。做类似的事情:
<postCode>${SpreadsheetInput#PostCode}</postCode>
在您的 SOAP 请求中,假设 PostCode 为空或完全不存在,将扩展为:
<postCode></postCode>
SoapUI 甚至会将其优化为:
</postCode>
然后你的验证开始了,它说你不需要提供这个元素,但如果你需要,最好是 4 个字符长。以上都失败了。
解决方法:
您需要务实地(意味着您必须编写 Groovy 代码)在您的请求中创建此节点。有几种方法可以处理这个问题。快速而肮脏的是 Groovy 步骤,类似于:
def postCode = context.expand('${SpreadsheetInput#PostCode}').trim()
if (postCode != null && postCode != '')
testRunner.testCase.setpropertyValue("postCodeNode", "<postCode>" + postCode + "</postCode>")
else
testRunner.testCase.setpropertyValue("postCodeNode", "")
然后在你的请求中替换原来的:
<postCode>${SpreadsheetInput#PostCode}</postCode>
只有:
${#TestCase#postCodeNode}
注意,XML 节点元素是 SoapUI 属性 的一部分!再次声明:SoapUI 中的所有内容都只是一个普通字符串。
如果你想要更硬核的东西,看看
dynamically create elements in a SoapUI request。这是我的。
我正在使用 SoapUI Pro 4.5.2 从电子表格中读取数据,将它们放入对我的 Web 服务的 Soap 请求中,然后获取响应以写入电子表格。有效。
我在输入数据中有两个字段与我的问题相关:
中间名定义为 4 个字符的字符串,并且 minOccurs = 1 和 maxOccurs = 1。
邮政分机号(普通5位代码后可选的4位数字)定义为4位的字符串。该字段是可选的,因此标记为 minOccurs=0 和 maxOccurs=1.
当我使用 SoapUI UI 接口发送请求时,这工作正常;如果中间名没有值,SoapUI 生成一个空标签并发送它(我猜是因为 minOccurs=1)。如果 PostalCode 没有值,它根本不会发送任何标签(我猜是因为 minOccurs=0)。
但是,当 SoapUI 从 Excel 电子表格中读取数据时,对相同数据的响应是一个错误,表明 '' 的扩展邮政编码值不合法,因为它必须是 4 位数字。似乎 SoapUI 在从电子表格读取数据时为扩展邮政编码生成了一个空标签,并发送了它。
我找到了 SoapUI 请求的 "Remove Empty Content" 选项,默认为 false。我将其设置为 true,现在从验证中返回一个错误,指示需要中间名但未找到。我猜 remove empty content 删除了所有空内容(足够合理),中间名必须在那里,即使是空的,因为 minOccurs=1.
我有办法解决这个追尾问题吗?我想我正在寻找类似邮政扩展代码输出的条件,所以即使它是空的,我也可以删除它,即使从电子表格中读取值也是如此。
我也很好奇是否有 XSD 修复程序,但我非常喜欢不涉及更改 XSD 的修复程序——这会成为一个政治问题。
编辑细节:
将输入放入请求中:我已经使用 SoapUI UI 从输入电子表格中为每个输入字段选择 "properties";完成后,最终会在请求字段中得到值,例如:
${SpreadsheetInput#FrstNm}
其中 SpreadsheetInput 是读取电子表格的数据源步骤的名称,FrstNm 是属性之一。我通过右键单击请求输入字段获得的弹出菜单中的 "Get Data" 选项来执行此操作,但可能还有其他方法。
首先是你的问题:
请记住,在 SoapUI 内部 几乎 一切都是字符串。做类似的事情:
<postCode>${SpreadsheetInput#PostCode}</postCode>
在您的 SOAP 请求中,假设 PostCode 为空或完全不存在,将扩展为:
<postCode></postCode>
SoapUI 甚至会将其优化为:
</postCode>
然后你的验证开始了,它说你不需要提供这个元素,但如果你需要,最好是 4 个字符长。以上都失败了。
解决方法:
您需要务实地(意味着您必须编写 Groovy 代码)在您的请求中创建此节点。有几种方法可以处理这个问题。快速而肮脏的是 Groovy 步骤,类似于:
def postCode = context.expand('${SpreadsheetInput#PostCode}').trim()
if (postCode != null && postCode != '')
testRunner.testCase.setpropertyValue("postCodeNode", "<postCode>" + postCode + "</postCode>")
else
testRunner.testCase.setpropertyValue("postCodeNode", "")
然后在你的请求中替换原来的:
<postCode>${SpreadsheetInput#PostCode}</postCode>
只有:
${#TestCase#postCodeNode}
注意,XML 节点元素是 SoapUI 属性 的一部分!再次声明:SoapUI 中的所有内容都只是一个普通字符串。
如果你想要更硬核的东西,看看 dynamically create elements in a SoapUI request。这是我的。