内容


自动化 WebSphere Commerce REST API 的测试

使用 SoapUI 设置一个测试自动化框架

Comments

简介

具象状态传输 (REST) 描述的是一种独立的服务,这些服务包含服务器收到每个请求时建立状态所需的所有信息。此信息包括由一个专用登录服务发出的 HTTP 身份验证参数,或令牌形式的身份验证信息。WebSphere® Commerce 提供了通过 WCToken 和 WCTrustedToken 令牌传输状态的机制。这两种令牌会在服务访问经过验证的网页时使用,比如购物车、结账和帐户管理页面。可以通过调用 guest_Identitylogin_Identity REST API,为来宾或请求的购买者惟一地生成这些令牌。

在服务调用需要身份验证信息的后续 REST API 时,比如与购物车、支付或订单处理相关的 REST API,还需要在标头中设置这两个令牌。在标头中设置参数的需求会限制测试流程的自动化,除非引入某种脚本来将参数从一个测试案例复制到另一个中。手动创建请求、设置需要的参数和执行测试的过程既单调又耗时。

本文将介绍如何使用 Groovy 脚本来在两个测试案例之间,然后在两个 REST API 之间复制信息,从而实现自动化。本文讨论的内容包括:

  • 定义参数来保存与服务端点、身份验证凭据等相关的信息的参数。
  • 将参数设置为请求内容的一部分。
  • 将参数设置为请求标头的一部分。
  • 解析 JSON 响应来提取合适的参数。

但是,本文中的功能测试仅限于以下两种场景:

  1. 使用合适的凭据调用 Login Identity REST API 来验证和接收 WCTokenWCTrustedToken
  2. 调用 Cart REST API 将一个产品添加到订单中。这还包括在标头中设置 WCTokenWCTrustedToken(在 Login Identity REST API 调用的响应中收到)参数。

先决条件

您需要熟悉 WebSphere® Commerce REST API 模型、SoapUI 测试工具、基本的 Java™ 和 Web 服务技能。

要完成本文中的步骤,您需要

  1. WebSphere® Commerce Developer V7 Feature Pack 8 - 本文中的示例使用了 Aurora B2C 入门商店
  2. 下载和设置 SoapUI - 您需要下载最新的开源版本的 SoapUI。要下载、安装和配置 SoapUI 工具,请参见 参考资料

    限制:SoapUI 是 smartbear.com 的受版权保护的软件。在使用 SoapUI 软件之前,您必须阅读 最终用户许可协议

设置测试案例

您需要验证您的 WebSphere Commerce 实例和设置测试案例。

验证您的 WebSphere Commerce 实例

使用 SoapUI 工具测试 REST API 之前,首先验证 WebSphere® Commerce 实例,找到添加到订单中的商店标识符 (storeId) 和产品标识符 (catentry_id)。

  1. 导航到 Aurora B2C 商店中任何产品的产品细节页面 (PDP) 。
  2. 查看产品的 SKU,如 图 1 中所示。
    图 1. 确定产品的 SKU
    该图显示了产品细节页面来确定 SKU
    该图显示了产品细节页面来确定 SKU
  3. 在您浏览器中导航到 http://localhost/webapp/wcs/admin/servlet/db.jsp
  4. 运行 清单 1 中所示的查询来检索产品标识符 (catentry_id)。
    清单 1. 检索产品标识符的查询
    select catentry_id from catentry where partnumber='GCL019_190101';
  5. 运行 清单 2 中所示的查询来检索商店标识符 (storeId)。
    清单 2. 检索商店标识符的查询
    select storeent_id from storeent where identifier='Aurora';

请记住:您的 WebSphere ® Commerce 实例中的 storeIdcatentry_id 值有所不同。记下这两个值,因为它们在后续步骤中很重要。对于本文,您使用了 wcsadmin 用户凭据。

技巧:如果未显示您商店中某个产品的 SKU,您可以按照以下说明找到该产品标识符:目录数据模型

设置 Login Identity REST 请求

设置 Login Identity REST 请求来检索 REST 身份验证令牌 WCTokenWCTrustedToken

  1. 在 SoapUI 中创建一个新 REST 项目,如 图 2 中所示,方法是指定以下 URI https://localhost/wcs/resources/store/10151/loginidentity

    信息:在 URI 中传递的商店值可以运行 清单 2 中所示的 SQL 查询进行检索。


    图 2. 创建新的 REST 项目
    该图显示了创建新的 REST 项目的过程
    该图显示了创建新的 REST 项目的过程
  2. 更新新创建的 REST 请求,如 图 3 中所示。
    1. 将请求名称重命名为 “Loginidentity_request
    2. 将 Method 从 GET 更改为 POST
    3. 确保 mediaType 是 application/json
    4. 设置正文中的身份验证细节(logonIdlogonPassword),如 清单 3
      清单 3. 设置正文中的身份验证细节
      中所示
      {
      "logonId":"wcsadmin",
      "logonPassword":"wcsadmin"
      }

    图 3. 创建 Login Identity 请求
    该图显示了创建 Login Identity 请求的过程
    该图显示了创建 Login Identity 请求的过程
  3. 提交该 REST 请求并检查是否成功执行。在响应窗口中,确保显示了 WCToken WCTrustedToken 值,如 图 4 中所示。
    图 4. Login Identity 响应
    该图显示了 Login Identity 响应
    该图显示了 Login Identity 响应

设置测试套件和登录身份测试案例

设置一个测试套件来运行多个测试案例。为 Login Identity REST API 创建一个新测试案例,并将上一节中创建的 REST 请求 添加到该测试案例中。

  1. 右键单击 REST Project 并创建一个名为 “REST TestSuite” 的新测试套件
  2. 右键单击 “REST TestSuite” 并创建一个名为 “Loginidentity_TestCase” 的新测试案例
  3. 右键单击 “Loginidentity_request” 并将它添加到 “Loginidentity_TestCase” 测试案例,将它命名为 “Loginidentity - Loginidentity_request
  4. 向 “Loginidentity - Loginidentity_request” 添加脚本类型的断言来确认身份验证已成功,而且 WCToken 已在响应中返回。使用 清单 4图 5 中所示的脚本作为断言。
    清单 4. login Identity 请求的断言
    import groovy.json.JsonSlurper
    
    def response=messageExchange.response.responseContent
    def slurper = new JsonSlurper()
    def json = slurper.parseText response
    
    assert json.WCToken

    图 5. Login Identity 断言
    该图显示了 Login Identity 断言
    该图显示了 Login Identity 断言

设置一个购物车测试案例

您将设置另外一个测试案例来测试将产品添加到订单的 Cart REST API

  1. 右键单击 “REST TestSuite” 并添加一个新测试案例 “CartAddOrderItem_TestCase”。
  2. 右键单击 “https://localhost” 服务并添加一个新资源,将 URI 指定为 “https://localhost/wcs/resources/store/10151/cart
  3. 更新新创建的 REST 请求:
    1. 将该请求重命名为 “CartAddOrderItem_request
    2. 将 Method 从 GET 更改为 POST
    3. 确保 mediaType 是 application/json
    4. 清单 5 中所示的代码添加到请求正文中。请注意代码中的令牌 $CatEntryId,您将使用 Groovy 脚本将它替换为测试案例级别的自定义参数。

      信息:在本文中,只考虑了一个产品,数量被设置为 1.0。您可以添加多个产品和参数化数量。

      清单 5. Cart REST 请求正文内容
      {
         "orderItem": [ 
      	  {
      	     "productId":"$CatEntryId",
      		 "quantity": "1.0"
      	  }
         ]
      }
  4. 右键单击 “CartAddOrderItem_request” ,通过将名称指定为 “CartAddOrderItem - CartAddOrderItem_request”,将该请求添加到测试案例 “CartAddOrderItem_TestCase” 中
  5. 清单 6 中所示的 Groovy 脚本,以便向请求 “CartAddOrderItem - CartAddOrderItem_request” 添加断言。将产品添加到购物车后,您会在响应中获得订单标识符,该标识符将用在断言中。
    清单 6. Cart REST 请求的断言
    import groovy.json.JsonSlurper
    
    def response=messageExchange.response.responseContent
    def slurper = new JsonSlurper()
    def json = slurper.parseText response
    
    assert json.orderId

自动化测试案例

您在测试套件和测试案例级别引入了属性。您还根据 Groovy 脚本引入了测试步骤,以便从响应中提取参数,并在请求标头和请求内容中设置参数。

引入属性

属性有助于对测试案例的执行参数化。属性可在测试套件级别和测试案例级别上进行定义。在这些级别上定义属性,可使属性能轻松地从 Groovy 脚本访问。

  1. 在测试套件级别上设置 RESTTestSuite_EndPointWCTokenWCTrustedToken 自定义属性,如 图 6 中所示。将 WCTokenWCTrustedToken 的值留空,因为它们会在执行 Login Identity 测试案例后设置。将 RESTTestSuite_EndPoint 属性的值设置为 https://localhost
    图 6. REST 测试套件自定义属性
    该图显示了 REST 测试套件自定义属性
    该图显示了 REST 测试套件自定义属性
  2. 打开请求 “Loginidentity - Loginidentity_request”,并在请求内容中引入参数 $logonId$logonPassword,如清单 7图 7 中所示。这些参数会使用 Groovy 脚本替换为在测试案例级别上设置的属性
    清单 7. 包含参数的 Login Identity REST 请求正文
    {
      "logonId" : "$logonId",
      "logonPassword" : "$logonPassword"
    }

    图 7. Login Identity 请求正文参数
    该图显示了 Login Identity 请求正文参数
    该图显示了 Login Identity 请求正文参数
  3. 将自定义属性 logonIdlogonPassword 添加到 “Loginidentity_TestCase” 测试案例中,如 图 8 中所示。将 logonId 设置为 wcsadmin。将 logonPassword 设置为 wcsadmin 用户的密码凭据。

    请记住:SoapUI 在您设置密码后会屏蔽它。


    图 8. Login Identity 测试案例自定义属性
    该图显示了 Login Identity 测试案例自定义属性
    该图显示了 Login Identity 测试案例自定义属性
  4. 将自定义属性 CartAddOrderItem_CatEntryId(如 图 9 中所示)添加到 “CartAddOrderItem_TestCase” 测试案例中。

    备注CartAddOrderItem_CatEntryId 属性的值等于运行 清单 1 中所示的查询而检索到的产品标识符 (catentry_id) 值。


    图 9. 购物车测试案例自定义属性
    该图显示了购物车测试案例自定义属性
    该图显示了购物车测试案例自定义属性

更新请求参数的流程属性

使用 Groovy 脚本来设置服务端点,并更新 Login Identity REST API 测试案例的请求正文参数。

  1. 右键单击 “Loginidentity_TestCase” 测试案例,并添加一个 “Groovy Script” 类型的新 “Test Step”。指定名称 “Loginidentity_prescript”。
  2. 右键单击 “Loginidentity_prescript” 测试步骤,并选择 “Move Step Up” 来将此测试步骤移动到请求 “Loginidentity - Loginidentity_request” 测试步骤上方。
  3. 清单 8图 10 中所示的代码添加到 Groovy 脚本 “Loginidentity_prescript” 中。该脚本读取在测试套件级别上设置的自定义属性来设置服务端点。该脚本还将请求内容中的 $logonId$logonPassword 值替换为在测试案例级别上设置的自定义属性值。
    清单 8. 测试步骤 Loginidentity_prescript 的 Groovy 脚本
    import groovy.json.*
    def testStepRequest = testRunner.testCase.testSteps["Loginidentity - Loginidentity_request"]
    
    //set the endpoint
    def suiteEndPoint = testRunner.testCase.testSuite.getPropertyValue("RESTTestSuite_EndPoint")
    testStepRequest.httpRequest.setEndpoint(suiteEndPoint)
    
    //set the authentication information
    def reqContentStr =testStepRequest.httpRequest.getRequestContent()
    def slurper = new JsonSlurper()
    def json = slurper.parseText(reqContentStr)
    JsonBuilder builder = new JsonBuilder(json)
    builder.content.logonId = testRunner.testCase.getPropertyValue("logonId")
    builder.content.logonPassword = testRunner.testCase.getPropertyValue("logonPassword")
    testStepRequest.httpRequest.setRequestContent(builder.toString())
图 10. Login Identity Groovy 预处理脚本
该图显示了 Login Identity Groovy 预处理脚本
该图显示了 Login Identity Groovy 预处理脚本

从响应中提取数据

在 “Loginidentity_TestCase” 测试案例级别上引入另一个 Groovy 脚本 “loginidentity_postscript” 来从 REST 响应中提取参数。请参阅 清单 9图 11。提取的参数用于更新在测试套件级别上定义的自定义属性 WCTokenWCTrustedToken 参数。在测试套件级别上设置的自定义属性可用于属于该测试套件的所有测试案例。

清单 9. 从 Login Identity REST 响应提取数据的 Groovy 脚本
import groovy.json.JsonSlurper
import com.eviware.soapui.support.types.StringToObjectMap

//extract the REST Authentication Tokens
def slurper = new JsonSlurper()
def json = slurper.parseText context.expand('${Loginidentity - Loginidentity_request#Response}')

//set the REST Authentication Tokens at TestSuite so that it can
//be retrived in all TestCases
testRunner.testCase.testSuite.setPropertyValue("WCToken", json.WCToken)
testRunner.testCase.testSuite.setPropertyValue("WCTrustedToken",json.WCTrustedToken)
图 11. Login Identity Groovy 后处理脚本
该图显示了 Login Identity Groovy 后处理脚本
该图显示了 Login Identity Groovy 后处理脚本

在测试案例之间传递信息

Cart REST API 的调用需要验证 WCTokenWCTrustedToken 令牌都已在请求标头中传递。您已从测试套件级别上执行和设置的 Login Identity REST API 上提取了这些参数。现在使用 Groovy 脚本来获取这些参数并在请求标头中设置它们。

  1. 右键单击 “CartAddOrderItem_TestCase” 测试案例,并添加一个 “Groovy Script” 类型的新 “Test Step”。指定名称 “CartAddOrderItem_prescript”。
  2. 右键单击 “CartAddOrderItem_prescript” 测试步骤,并选择 “Move Step Up” 将此测试步骤移动到请求 “CartAddOrderItem - CartAddOrderItem_request” 测试步骤上方。
  3. 清单 10图 12 中所示的代码添加到 Groovy 脚本 “CartAddOrderItem_prescript” 中。在此脚本中,您设置了服务端点、请求标头中的身份验证令牌以及请求正文中的产品标识符。
清单 10. 将信息传递给购物车测试案例的 Groovy 脚本
import groovy.json.*

def testStepRequest = testRunner.testCase.testSteps["CartAddOrderItem - CartAddOrderItem_request"]

//set the endpoint
testStepRequest.httpRequest.setEndpoint( 
    testRunner.testCase.testSuite.getPropertyValue("RESTTestSuite_EndPoint"));

//set the REST Authentication Tokens
def headers =testStepRequest.httpRequest.getRequestHeaders()
headers.put("WCToken", testRunner.testCase.testSuite.getPropertyValue("WCToken"))
headers.put("WCTrustedToken", 
  testRunner.testCase.testSuite.getPropertyValue("WCTrustedToken"))
testStepRequest.getHttpRequest().setRequestHeaders(headers)

//set the CatEntryId
def reqContentStr =testStepRequest.httpRequest.getRequestContent()
def slurper = new JsonSlurper()
def json = slurper.parseText(reqContentStr)
JsonBuilder builder = new JsonBuilder(json)
builder.content.orderItem[0].productId 
  = testRunner.testCase.getPropertyValue("CartAddOrderItem_CatEntryId")
testStepRequest.httpRequest.setRequestContent(builder.toString())
图 12. cart_prescript 测试步骤的 Groovy 预处理脚本
该图显示了 cart_prescript 测试步骤的 Groovy 预处理脚本
该图显示了 cart_prescript 测试步骤的 Groovy 预处理脚本

执行测试案例

运行该测试案例,确认所有断言都传递了状态 VALID。

  1. 保存 REST 项目。
  2. 右键单击 “REST TestSuite” 来启动测试运行器。从菜单中选择 “Launch TestRunner”。在随后出现的对话框 (图 13) 中,将 TestCase 设置为 “All” 并单击 “Launch”。
    图 13. 测试套件 TestRunner 启动器
    该图显示了测试套件 TestRunner 启动器
    该图显示了测试套件 TestRunner 启动器
  3. 确保测试套件已成功运行,为所有断言都传递了状态 VALID。
  4. 可选的数据库验证:您可以验证产品是否已添加到订单中
    1. 在浏览器中导航到 http://localhost/webapp/wcs/admin/servlet/db.jsp
    2. 执行 清单 11 中所示的 SQL 查询来检索订单项详细信息。确认看到了通过 REST 请求提交的产品
      清单 11. 用于确认产品已添加到订单中的 SQL 查询
      select * from orderitems where orders_id in (select orders_id from orders order by orders_id desc);

结束语

本文演示了如何使用 SoapUI 来自动化 WebSphere Commerce REST API 的功能测试,还解释了如何使用 Groovy 脚本在测试案例之间传递信息。该自动化是在通过 WebSphere® Commerce 的 login_identity REST API 生成的身份验证令牌上下文中描述的,但您可以将此概念扩展到任何生成身份验证令牌(比如 guest_identityltpa_identity)的 API。

还可以扩展此方法来包含和测试 WebSphere Commerce 项目的所有 REST API。在任何项目(尤其是敏捷开发)中使用此方法的一个重要优势是,可以根据需要添加更多测试案例和脚本来灵活地持续扩展测试套件,开发一个全面的端到端自动化功能测试基础架构。这使您能够及时地测试新功能或修复程序,因为自动化测试可以快速而又频繁地运行,这使得它们富有成本效益。这还支持跨一组不同环境并行执行全面测试或增量测试,可以缩短开发时间和提升软件质量。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=1017363
ArticleTitle=自动化 WebSphere Commerce REST API 的测试
publish-date=10132015