我正在使用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请求的选项,默认为false。我将其设置为true,现在从验证中返回错误,指示中间名是必需的但未找到。我猜测删除空内容删除了所有空内容(足够合理),中间名必须在那里,即使是空的,因为minOccurs = 1。
我有没有办法解决这个追尾问题?我想我正在为邮政扩展代码的输出寻找类似于条件的东西,所以即使从电子表格中读取值,如果它是空的我也可以消除它。
我也很好奇是否有XSD修复,但我更喜欢修改并不涉及更改XSD - 这成为一个政治问题。
编辑细节:
将输入放入请求中:我使用SoapUI UI来选择"属性"来自每个输入字段的输入电子表格;完成后,最终会在请求字段中输入值,如:
$ {SpreadsheetInput#FrstNm}
其中SpreadsheetInput是读取电子表格的数据源步骤的名称,而FrstNm是其中一个属性。我使用" Get Data"右键单击请求输入字段,弹出菜单中的选项,但可能还有其他方法。
答案 0 :(得分:2)
首先是你的问题:
请记住,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。这是我的。