本文将介 绍 Rational Test Virtualization Server、IBM® Rational® Test Workbench 和 IBM® Worklight。还将介绍如何在 IBM Rational Integration Tester 中开发存根和虚拟服务,以及如何将它们与 IBM Worklight Adapter 集成。
备注:要详细理解本文,有必要深入了解这些产品的应用知识。
为什么使用测试虚拟化?
一 些因素限制了充分测试软件的能力:紧张的生产日程、安全限制、第三方软件高昂的使用费用,以及使用不容易获取的硬件的需求。您可以使用测试虚拟化创建虚拟 服务来模拟整个应用程序或系统的行为,这些服务也可以在任何商业硬件、私有云或公共云上运行。要实现测试虚拟化,可以使用:
- Rational Test Workbench 捕获和建模虚拟服务
- Rational Test Virtualization Server 管理虚拟服务。
使用 IBM Worklight 开发移动应用程序
IBM Worklight 是一个移动应用程序开发环境。它包含用户代码开发的 Worklight Studio、用于集成后端服务的 Worklight Server、Worklight Runtime Components 和 Worklight Console。Worklight 适配器构成了传输层,供 Worklight Server 用于连接到各种后端系统。
每个 Worklight 适配器包含:
- 一个 XML 文件,描述连接选项并列出向应用程序或其他适配器公开的过程。
- 一个 JavaScript 文件,包含 XML 文件中声明的过程的实现。
- 零个或多个 XSL 文件,包含获取的原始 XML 数据的一种转换模式。
适配器获取的数据保留原始格式,或者由进行适当的预处理。在两种情况下,数据都向应用程序显示为 JSON 对象。
基于 Rational Quality Manager 移动客户端开发一种场景
IBM® Rational® Quality Manager 移动客户端是一种使用 Worklight 集成开发环境 (IDE) 开发的移动应用程序。移动客户端有两个组件:用户界面和 Worklight 适配器。
使用用户界面,测试人员可登录到 Rational Quality Manager 服务器并获取项目区域,获取所选项目的测试执行记录。在本例中,项目为 Testing Purposes Only 2 – CLM 2012 (Quality Management)。 用户界面通过一个在 Worklight 服务器上运行的适配器连接到 Rational Quality Manager 服务器。此适配器使用 REST API 与 Rational Quality Manager 服务器通信来获取数据并将数据传输到用户界面。
Rational Quality Manager Worklight 适配器是一个传输层,可用于配置连接细节和配置获取需要的数据的方法。这些细节在一个称为 adapter.xml 的配置文件中提供。在本例中,该文件名为 RQMAdapter.xml。
在文件 RQMAdapter.xml 中指定配置细节
适配器的常用配置细节如清单 1 所示:
清单 1. RQMAdapter.xml 的配置细节
<displayName>RQMAdapter</displayName> <description>HTTP type Worklight Adapter for jazz server</description> <connectivity> <connectionPolicy xsi:type="http:HTTPConnectionPolicyType"> <protocol>https</protocol> <domain>jazz.net</domain> <port>443</port> </connectionPolicy> <loadConstraints maxConcurrentConnectionsPerNode="2" /> </connectivity>
更新以下值,使之与您的配置相匹配:
- jazz.net:Rational Quality Manager 和 Jazz 服务器部署到的公共 URI。
- https:用于身份验证的安全 http 协议
- 443:Jazz 服务器使用的安全端口
在文件 RQMAdapter.xml 中获取过程细节
RQMAdapter.xml 文件获取向 Rational Quality Manager 服务器执行身份验证,从服务目录获取项目区域,以及获取指定项目的测试执行记录的过程,如清单 2 所示:
清单 2. RQMAdapter.xml 中的过程细节
<procedure name="loginToRQM" /> <procedure name="fetchServiceCatalogXML" /> <procedure name="getAllTERs" />
使用函数 loginToRQM 执行身份验证
第一步是使用一个用户名和密码向 Rational Quality Manager 服务器执行身份验证。在清单 3 中,loginToRQM 过程使用 POST 方法向 URL jazz/auth/j_security_check 发出这些凭据来执行 Jazz 身份验证。
清单 3. loginToRQM 函数
function loginToRQM(username, passwd) { var lpath = 'jazz/auth/j_security_check'; var input = { method : 'post', returnedContentType : 'html', path : lpath, parameters : { j_password : passwd, j_username : username }; }
使用函数 fetchServiceCatalogXML 获取项目区域
成功执行身份验证后,使用 fetchServiceCatalologXML 函数获取一个该用户(由用户名表示)所属的项目区域列表。在清单 4 中,fetchServiceCatalogXML 函数使用 GET 方法在 URL /qm/oslc_qm/catalog 上获取这些项目区域。
清单 4. fetchServiceCatalogXML 函数
function fetchServiceCatalogXML(catalogPath) { // catalogPath = '/qm/oslc_qm/catalog' var input = { method : 'get', returnedContentType : 'xml', path : catalogPath, }; var response = WL.Server.invokeHttp(input); return response; }
使用函数 getAllTERs 获取测试执行记录
getAllTERS 函数使用 GET 方法在 URL qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/Testing+Purposes+Only+2+-+CLM+2012/executionworkitem/ 上获取项目区域 Testing+Purposes+Only+2+-+CLM+2012 中的测试执行记录,如清单 5 所示。
清单 5. getALLTERs 函数
function getAllTERs() { var cpath = "qm/service/com.ibm.rqm.integration.service.\ IIntegrationService/resources/Testing+Purposes+Only+2+-+CLM+2012/executionworkitem/"; var input = { method : 'get', path : cpath body : { contentType : 'text/xml; charset=utf-8' } }; return WL.Server.invokeHttp(input); }
使用 RQMLight.js 从后端服务获取数据
Rational Quality Manager 移动客户端用户界面是一个移动应用程序,它调用函数来登录到后端服务并从后端服务获取数据。该客户端使用 JavaScript(在本例中为 RQMLight.js)实现,该代码中包含的函数与 RQMadapter 类似,如清单 6 所示。
清单 6. RQMLight.js 函数
//Function to login to Rational Quality Manager Server function loginToRQM(uname, pword, adapterName) { /* set adapter for RQM repository */ RQM_ADAPTER = adapterName; var invocationData = { adapter : RQM_ADAPTER, procedure : ADAPTER_PROC1, parameters : [ uname, pword ] }; WL.Client.invokeProcedure(invocationData, { onSuccess : loginFormSuccessHandler.bind(this), onFailure : loginFormFailureHandler.bind(this), timeout : 50000 }); //Function to get the service catalog that contains the project areas function discoverServices() { var cmCatalogURL = "/qm/oslc_qm/catalog"; var invocationData = { adapter : RQM_ADAPTER, procedure : ADAPTER_PROC6, parameters : [ cmCatalogURL ] }; WL.Client.invokeProcedure(invocationData, { onSuccess : discoverServicesSuccessHandler.bind(this), onFailure : discoverServicesFailureHandler.bind(this), timeout : 30000 }); } //Function to parse service catalog function serviceCatalogSuccessHandler(response) { var serviceProviderURLPattern = /(_.+?)\/?$/; var serviceProviderURLMatcher; var serviceCatalogJsonObj = response.invocationResult; var serviceCatalogEntryArr = serviceCatalogJsonObj['ServiceProviderCatalog']['entry']; for ( var iter = 0; iter < serviceCatalogEntryArr.length; iter++) { var serviceProviderMap = serviceCatalogEntryArr[iter]['ServiceProvider']; var serviceProviderTitle = serviceProviderMap['title']; var serviceProviderURL = serviceProviderMap['details']['resource']; serviceProviderURLMatcher = serviceProviderURLPattern .exec(serviceProviderURL); projectAreaInfoMap[serviceProviderTitle] = serviceProviderURLMatcher[1]; jq("#projectAreas").append( "<option value=\"" + serviceProviderTitle + "\" >" + serviceProviderTitle + "</option>"); //Function to get the test execution records in a specified project area function getAllTERs() { var cpath = "qm/service/com.ibm.rqm.integration.service.\ IIntegrationService/resources/Testing+Purposes+Only+2+-+CLM+2012/executionworkitem/"; var winput = { method : 'get', path : cpath body : { contentType : 'text/xml; charset=utf-8' } }; return WL.Server.invokeHttp(winput); }
图 1 显示了 Rational Quality Manager 客户端、Rational Quality Manager 适配器和 Rational Quality Manager 服务器之间的集成。
图 1. Rational Quality Manager 客户端、服务器和适配器之间的交互
在 IBM Rational Test Workbench 中构建场景
第一步是在 Rational Integration Tester 中通过两个操作来设计一个服务组件:discoverServices 和 getAllTERs。使用这些操作,创建称为 “存根” 的虚拟服务并将它发布到 Rational Test Virtualization Server,部署在一个特定的域中。在 Rational Test Control Panel 中启动存根后,应用程序就可以使用它。
在 Rational Integration Tester 中设计服务组件
图 2 显示了服务组件以及它们各自在 Rational Integration Tester 中的物理视图。
图 2. Rational Quality Manager 服务组件和 Rational Integration Tester 中的物理视图
在 Rational Integration Tester 中,通过 HTTP 代理运行存根
Rational Integration Tester 所提供的 HTTP 代理通过 HTTP 运行存根。在 Rational Control Panel 中,可以将该代理视为一个代理,在端口 3128 上注册。向存根发送消息的应用程序必须配置为经由代理发送。如果使用 Rational Integration Tester 测试存根,那么可以在 Web 服务器的 HTTP 连接的 Client 选项卡中输入 HTTP 代理设置。要获取这些设置,可右键单击 localhost 或您的 Web 服务器。在对话框中输入服务器和客户端的细节,如图 3 所示。
图 3. 配置 httpclient 的代理设置
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14535-50.jpg)
配置 discoverServices 操作
要配置 discoverServices 操作的属性,可以从服务组件内双击 discoverServices。如图 4 所示,在 Message Exchange Pattern 选项卡上,应将 Pattern 字段设置为 Request/Reply。在 Request 行上,单击 Browse 打开 Select Schema 对话框。为消息选择一种模式。
图 4. 配置 discoverServices 的模式
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14537.jpg)
在 Select a Schema 对话框中,选择 REST 选项并单击 new URL 按钮(在工具栏上以红色突出显示)导入一个 REST 模式。URL 对话框打开时,单击 Import URL Template 并输入 /qm/oslc_qm/catalog 作为 Importing URL,如图 5 所示。
图 5. 导入 URL 模板作为 discoverServices 的模式
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14538.jpg)
指定导入 URL,单击 OK。这将打开 Edit URL Template 对话框。在 Template Name 字段中,键入 discoverServices,如图 6 所示。
图 6. Edit URL Template 对话框
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14539.jpg)
要添加 discoverServices 作为新模式名称,请单击 OK,如图 7 所示。
图 7. 添加 discoverServices 作为内部模式
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14539-50.jpg)
要添加 discoverServices 作为 Request 字段中的模式名称,可单击 Finish。在 Reply 字段中,选择 Root 字段中的 xml:Element,如图 8 所示。
图 8. 配置 discoverServices 的 Request 和 Reply 字段
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14539-51.jpg)
使 用相同的流程,使用 URL qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/Testing+Purposes+Only+2+-+CLM+2012/executionworkitem/ 为 getAllTERs 添加一种模式,如图 9 所示。
图 9. 配置 getALLTERs 的属性
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14541.jpg)
开发 discoverServices 存根
在 Rational Integration Tester 的 Test Factory Logical 视图中,右键单击 discoverServices。选择 New>Stubs>Stub using MEP。在打开的 Create new Stub 对话框中,将存根的名称指定为 discoverServicesStub,如图 10 所示。
图 10. Create new Stub from MEP 对话框
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14548.jpg)
打开 discoverServices 的存根编辑器,将 Input Message Body 设置为 /qm/oslc_qm/catalog。在 Message Header 中输入 /qm/oslc_qm/catalog 作为 URL,如图 11 所示。
图 11. 指定 discoverServices 的消息标头和消息主体
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14549.jpg)
在 discoverServices 的存根编辑器中,将包含 Rational Quality Manager 服务器的目录细节的 XML 复制到 Output 选项卡中的 Message 部分,如图 12 所示。此消息会在收到针对 Catalog 的请求时返回。
图 12. discoverServicesStub 的 Output 选项卡
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14549-50.jpg)
清单 7. discoverServicesStub 消息输出的示例
<?xml version="1.0" encoding="UTF-8"?> <oslc_disc:ServiceProviderCatalog xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/" rdf:about="https://jazzdev.torolab.ibm.com:9443/qm/oslc_qm/catalog" xmlns=" http://purl.org/dc/elements/1.1/" xmlns:calm="http://jazz.net/xmlns/prod/jazz/calm/1.0/" xmlns:dc="http://purl.org/dc/terms/" xmlns:jpres="http://jazz.net/xmlns/prod/jazz/presentation/1.0/" xmlns:jproc="http://jazz.net/xmlns/prod/jazz/process/1.0/" xmlns:ns3=" http://open-services.net/ns/core#" xmlns:ns5="http://open-services.net/ns/qm#" xmlns:ns8="http://jazz.net/ns/qm/rqm#" xmlns:oslc_qm="http://open-services.net/xmlns/qm/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <dc:title>RQM Quality Management Service Provider Catalog</dc:title> <oslc_disc:entry> <oslc_disc:ServiceProvider> <dc:title>Jazz Collaborative ALM (QM)</dc:title> <oslc_disc:details rdf:resource= "https://jazz.net/qm/process/project-areas/_lOUgkJ5fEd-SNKZzk9mZxQ"/> <oslc_disc:services rdf:resource= "https://jazz.net/qm/oslc_qm/contexts/_lOUgkJ5fEd-SNKZzk9mZxQ/services.xml"/> <jproc:consumerRegistry rdf:resource= "https://jazz.net/qm/process/project-areas/_lOUgkJ5fEd-SNKZzk9mZxQ/links"/> </oslc_disc:ServiceProvider> </oslc_disc:entry> <oslc_disc:entry> <oslc_disc:ServiceProvider> <dc:title>Rational Team Concert (QM)</dc:title> <oslc_disc:details rdf:resource= "https://jazz.net/qm/process/project-areas/_e2-coJ5iEd-SNKZzk9mZxQ"/> <oslc_disc:services rdf:resource= "https://jazz.net/qm/oslc_qm/contexts/_e2-coJ5iEd-SNKZzk9mZxQ/services.xml"/> <jproc:consumerRegistry rdf:resource= "https://jazz.net/qm/process/project-areas/_e2-coJ5iEd-SNKZzk9mZxQ/links"/> </oslc_disc:ServiceProvider> </oslc_disc:entry> <oslc_disc:entry> <oslc_disc:ServiceProvider> <dc:title>Jazz Foundation (QM)</dc:title> <oslc_disc:details rdf:resource= "https://jazz.net/qm/process/project-areas/_op9jIJ8yEd-SNKZzk9mZxQ"/> <oslc_disc:services rdf:resource= "https://jazz.net/qm/oslc_qm/contexts/_op9jIJ8yEd-SNKZzk9mZxQ/services.xml"/> <jproc:consumerRegistry rdf:resource= "https://jazz.net/qm/process/project-areas/_op9jIJ8yEd-SNKZzk9mZxQ/links"/> </oslc_disc:ServiceProvider> </oslc_disc:entry> <oslc_disc:entry> <oslc_disc:ServiceProvider> <dc:title>Testing Purposes Only 2 - CLM 2012 (Quality Management)</dc:title> <oslc_disc:details rdf:resource= "https://jazz.net/qm/process/project-areas/_C1_L14ZiEeGGGbas5O0s4A"/> <oslc_disc:services rdf:resource= "https://jazz.net/qm/oslc_qm/contexts/_C1_L14ZiEeGGGbas5O0s4A/services.xml"/> <jproc:consumerRegistry rdf:resource= "https://jazz.net/qm/process/project-areas/_C1_L14ZiEeGGGbas5O0s4A/links"/> </oslc_disc:ServiceProvider> </oslc_disc:entry> </oslc_disc:ServiceProviderCatalog>
现在将存根发布到 Rational Test Virtualization Server。右键单击 Stubs 文件夹并选择 Publish stub。这将打开 Publish Stubs 对话框,其中已选择了默认的域和环境 RQMEnv。单击 Publish 将存根发布到服务器,如图 13 所示。按照类似的步骤创建 getAllTERs 存根。
图 13. Publish Stubs 对话框
![使用IBM Rational Test Virtualization Server测试移动应用程序](http://www.ithov.com/uploads/allimg/140808/1-140PQ14550.jpg)
在 Rational Test Virtualization Server 中运行存根
启动浏览器并连接到 http://localhost:7819/RTCP。单击 VIE 菜单显示 RQM Service Component 下的存根,如图 14 所示。要运行该存根,可右键单击它并选择 Start stub。
图 14. Rational Test Control Panel 中的 RQMEnv 选项卡
修改 Worklight Rational Quality Manager 适配器连接选项
这些存根现在已准备好与 Worklight Rational Quality Manager 适配器集成。您需要修改连接选项,以便包含 HTTP 代理细节。如清单 8 所示。
清单 8. RQMAdapter 连接选项
<displayName>RQMAdapter</displayName> <description>HTTP type Worklight Adapter for jazz server</description> <connectivity> <connectionPolicy xsi:type="http:HTTPConnectionPolicyType"> <protocol>http</protocol> <domain>localhost</domain> <proxy> <protocol>http</protocol> <domain>localhost</domain> <port>3128</port> </proxy> </connectionPolicy> <loadConstraints maxConcurrentConnectionsPerNode="2" /> </connectivity>
替换以下值:
- localhost:localhost 或部署 HTTP 代理的 URI
- http:用于连接到 HTTP 代理的 HTTP 协议
- 3128:HTTP 代理使用的端口
重 新将 Worklight Rational Quality Manager 适配器部署到 Worklight 控制台中。刷新 Worklight 控制台,以便查看 HTTP 代理的已更新的连接细节。移动应用程序现在已与存根相集成。重新运行移动应用程序,您可以登录到 Rational Quality Server 来获取项目区域和测试执行记录。
结束语
开 发存根的过程是劳动密集型的。本文提供了实现和部署 REST API 存根的简单步骤。我们使用 Rational Quality Manager REST API 来获取项目区域和关联的测试执行记录,通过该场景演示了这些步骤。类似的过程可用于其他任何 REST 服务。