1.1 开发一个用于测试的SOAP Web服务
SoapUI通常用于改进已经至少部分开发的Web服务的测试。遵循测试优先(test-first)或测试驱动开发(TDD)方法要求我们首先设置失败的测试用例,然后提供一个服务实现通过这些失败的测试用例。
1.1.1 准备阶段
需要从上个章节中穿点的SoapUI 项目(<chapter1samples>/soap/invoicev1_impl),使用java代码实现web服务实现代码在:<chapter1 samples>/soap/invoicev1_impl。可看到项目:
<chapter1samples>/invoice-soap-v1-soapuiproject.xml。
Tip:使用Eclipse项目创建一个轻量级的测试、边际、编译以及循环运行都是很容易的。首先,导入实例代码,作为一个标准的java应用程序运行。
1.1.2 创建步骤
首先,创建一组简单的失败的测试去查看getInvoice操作返回预期的结果,然后提供一些基础的实现来通过这些失败的测试。
其次,为了createInvoice操作的实现更新invoice的WSDL定义,创建失败的测试用例,最后提供基本的编码来通过这些测试用例。执行步骤如下:
1. 创建SoapUI项目,生成初始化PortBinding、Test Suite、TestCase、Test Request TestStepm,右击工作空间(workspace)选择创建SOAP项目(New SOAP Project)。在当前窗口,输入如下信息,然后点击OK:
n 项目名称:InvoiceService
n 初始化WSDL: \SoapUIcook\chapter1\soap\invoicev1_impl\wsdl
n 保留“创建请求”勾选,并勾选创建测试集(CreateTestSuite)
2. 在“生成测试集(Generate TestSuite)”窗口,勾选如下选项然后点击OK:
l 风格勾选“一个测试用例对应一个操作”
l 请求内容使用“接口已经存在的请求”
3. 使用建议的测试集名称“InvoicePortBinding TestSuite”。所有测试期望的SoapUI测试框架现在在项目中都已经生成!
4. 现在,写一个简单的失败测试用例来判断一个成功的getInvoice请求返回的内容与预期一致。在第一个TestStep选项中,双击getInvoice你将看到一个如下的SOAP请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:inv="http://soapui.cookbook.samples/schema/invoice">
<soapenv:Header/>
<soapenv:Body>
<inv:getInvoice>
<inv:invoiceNo>?</inv:invoiceNo>
</inv:getInvoice>
</soapenv:Body>
</soapenv:Envelope>
5. 把上述SOAP请求中invoiceNo(?)值改为一个更容易记忆的值,如:12345
6. 启动在之前生成的invoice服务stub
让后点击绿色箭头表示提交请求,如下图所示
可以看到一个stubbed响应,响应信息如下编码:
7. 给预期的指定期望的invoice属性值设置SoapUI断言,例如如下的属性值:invoceNo=12345、company=Test Company、amount=100.0
由于处理的士SOAP XML文件,因此在这里给这些响应中的值使用xpath断言。SoapUI Pro用户可以使用xpath构建,很容易实现,操作步骤如下:
如果是开源免费的用户,需要自己写,或者复制提供的详细信息。根据xpath实例,这里做下解释说明:
Ø declare namespacens1='http://soapui.cookbook.samples/schema/invoice';
Ø //ns1:InvoiceDocument[1]/ns1:amount[1]
使用declare namespace声明命名空间为ns1,编写xpath://ns1:InvoiceDocument[1]/ns1:amount[1]
TIPS:
XPATHHELP: 即使是Pro版本的XPath构建器,如果不能直接检索构建的响应XML,也就是根本没有服务时,它的用处就会减少。以这个作为工作背景,可以通过Add Step|SOAP Mock Respone测试步骤生成一个简单的响应XML到测试用例中,这时复制响应XML到一个有用的XPATH工具中,来编写XPATH表达式,这些工具例如:
免费的:https://www.freeformatter.com/xpath-tester.html, 付费的工具,例如XML Spy这些领域也有一些帮助。也可以学习一些xpath语法规则自己编写xpath,xpath链接如下:
http://www.w3schools.com/XPath/xpath_syntax.asp。
TIPS:
服务超时:如果看到请求返回一个拒绝错误(refuse error),这时检查服务是否离开(服务器默认是5分钟),这很容易改变超时计数值。可以通过添加一个基本的服务实现,来通过这个测试。需要实现InvoicePortImpl.java中的getInvoice()方法。这个简单的实现选项仅仅是重新编辑InvoicePortImpl.java,添加如下所示的核心代码:
TIPS:
TDD(测试数据驱动):严格来说,在实现方法之前,需要写一个单元测试,例如,使用Junit。然后重新编译、重新启动服务。
重新运行测试,测试执行通过!
1.1.3 怎么使用
本部分建立在与上一部门相同的JAX-WS服务代码解释上。添加一个简单的stub实现,该实现返回最少的必要信息,以至于该stub通过测试!对于那些以前没有见过JAX-WS的人来说,使用javax.xml.ws.Holder包装器对象意味着不必显式设置invoiceNo,因为它是通过请求传递的。(详细信息,可以看:http://tomee.apache.org/examples-trunk/webservice-holder/README.html)
在上一部分提及的SoapUImocks,它能提供一个简便、快速的替代,如果是需要对带有基本功能实现的web服务执行一次性测试版本。然而,如果想web服务stub作为持续开发的基础,这时可能需要考虑使用一个构建框架,如Gradle或者Maven去管理构建、部署、测试周期。在“自动化和脚本章节”,在web服务构建并部署完成后,可以看到使用构建框架和脚本来运行SoapUI测试(mocks)的不同之处。如果stub实现变得越来越复杂,你可能想要单元测试。
在下一部分,将告诉你如何使用SoapUI来帮助用户更新项目、测试、服务到新添加的createInvoice操作函数。
n Gradle更多信息:https://www.gradle.org/
n Maven更多信息:http://maven.apache.org/
n JUnit更多信息:http://junit.org/