IBM®Rational®Quality Manager是用于管理质量保证团队项目的测试管理和质量管理工具。 它建立在IBM Rational Jazz™平台上,并继承了其表示状态转移(REST)功能和基于Rational Jazz基于表单的认证机制。 最好使用IBM Rational Performance Tester Extension for SOA Quality通过REST API对Rational Quality Manager服务器进行负载测试。 但是,由于以下原因,以这种方式进行测试可能很困难:
- SOA质量扩展不提供对Jazz身份验证机制的内置支持。
- 使用SOA质量扩展的HTTP代理记录器记录Rational Quality Manager会话会生成复杂的测试场景,这些场景很难理解和处理。
本文描述的最佳实践包括使用通用服务客户机与Rational Quality Manager提供的RESTful Web服务进行交互,并生成简单,方便的测试场景。
本文档是使用IBM Rational Quality Manager 2.0.0.1 iFix003标准版和IBM Rational Performance Tester扩展用于SOA质量8.1.1编写的。
Jazz认证机制和正在测试的服务
要为Rational Quality Manager构建简单的负载测试,必须使用Rational Quality Manager Server进行认证。 Rational Quality Manager使用基于Jazz表单的用户认证方案。
在https://jazz.net/wiki/bin/view/Main/JFSCoreSecurity#User_Authentication中描述了该方案。 在https://jazz.net/wiki/bin/view/Main/WritingAJazzClient上描述了在IBM Rational Jazz Team Server上进行认证的方式。
简而言之,客户端必须进行身份验证才能从服务器获取会话ID,然后在对服务器的所有后续请求中将此ID用作cookie。 您可以使用通用服务客户端获取会话ID。
您在此处与之交互的Rational Quality Manager服务将处理测试用例。 Rational Quality Manager通过URL与此地址相似的Atom提要发布其大多数工件(包括测试用例)的XML表示形式:
https:// rqmserver:9443 / jazz / service / com.ibm.rqm.integration.service.IIntegrationService / testcase,其中rqmserver是您的Rational Quality Manager服务器或IP地址的名称。
对于后续步骤,您需要具有Atom提要发布的测试用例的URL。
图1. Rational Quality Manager测试用例提要
可以使用各种REST命令查询以下工件:
- 使用GET获取XML表示形式。
- 使用POST创建工件。
- 使用PUT修改工件。
- 使用DELETE删除工件。
使用通用服务客户端向Rational Quality Manager服务器进行认证
要使用Rational Quality Manager服务器进行认证:
- 在“性能”透视图中,使用临时工具栏按钮打开通用服务客户端:
图2.打开通用服务客户端
“服务”页面显示Web服务描述语言(WSDL)文件库,端点请求以及所有请求的历史记录。 传输页面管理基础传输配置。 在这种情况下,传输配置基于HTTPS。
图3.通用服务客户端“服务”页面
- 查询测试用例的XML表示形式:
- 单击添加端点请求 ,然后输入GET方法和Atom提要发布的测试用例的URL:
图4.创建一个端点请求
注意:
默认的HTTP不覆盖HTTPS,因此必须为此请求创建特定的HTTPS配置。
- 单击新建 ,输入名称,然后选择保持活动和SSL证书 :
图5.创建协议配置
- 单击“ 打开SSL编辑器” ,然后单击“ 重命名”。
- 重命名SSL配置:
图6.重命名SSL配置
- 单击“ 确定”三次,单击“ 下一步” ,然后单击“ 完成”以创建请求。
该请求显示在常规服务客户端的右窗格中:
图7.通用服务客户端中显示的请求
- 单击“ 调用”以调用请求并显示服务器响应。 请求和响应存储在请求历史记录中:
使用“请求历史记录”框,用户可以快速检索他们发送的请求和相应的响应。
图8. Request History框
在这种情况下,来自服务器的响应消息为空,但是“响应属性”页面包含以下信息:
图9.响应属性
前面提到的会话ID(在此为JSESSIONID cookie)特别受关注。 重定向到查询的测试用例的URL(作为Location属性)也包含重要信息。 此外,设置为authrequired
的x-com-ibm-team-repository-web-auth-msg
响应标头指示您必须遵循Jazz认证方案。
小费:
可以选择和复制属性名称和值,这有助于使用已建立的值创建请求。
为了符合身份验证方案,您需要在重定向URL上调用另一个GET操作,将会话ID作为cookie发送,并使用相同的HTTPS配置
图10.使用JSESSIONID会话ID的端点请求
- 在通用服务客户端中调用操作,并查看响应的属性:
图11.需要身份验证的响应
响应属性包含设置为authrequired
的X-com-ibm-team-repository-web-auth-msg
HTTP标头,并且不包含重定向位置。 Jazz认证机制指定下一步是在进行必要的准备后进行认证。
- 使用POST操作将用户凭据(用户名和密码均为“ admin”)发布到以下地址:
https://rqmserver:9443/jazz/ authenticated/j_security_check?j_username=admin&j_password=admin
服务器还需要Path=jazz
cookie
语句。 用户身份验证Jazz方案需要application / x-www-form-urlencoded内容类型标头。
身份验证请求如下图所示:
图12.身份验证请求
- 调用请求,然后看到响应属性不再包含x-com-ibm-team-repository-web-auth-msg标头。
图13.认证被授予
Location属性会将您重定向到与身份验证之前相同的URL。
使用请求历史记录来完成认证
您可以利用通用服务客户端的“请求历史记录”框来检索第二个请求。 使用该请求作为新请求的基础,以节省时间:
- 在“请求历史记录”框中,选择您提出的第二个请求:
图14.从请求历史记录中检索请求
该请求显示在通用服务客户端的右窗格中,可以按原样调用。
- 单击“ 调用”,然后在响应中查看“ 位置”属性:该属性包含不重定向您的URL。 实际上,URL是您在初始GET操作中使用的原始地址。
图15.一个不重定向的URL
您可以在“请求历史记录”框中检索第一个请求,并添加JSESSIONID cookie以使其起作用:
图16.添加了JSESSIONID cookie的第一个请求
在再次调用GET请求之后,响应中包含一条消息,该消息是Rational Quality Manager测试用例的XML描述。 此屏幕截图显示了“表单”视图中的XML描述:
图17.测试用例XML描述的Form视图
Tree视图将XML元素显示为分层树,Source视图显示XML代码:
图18.测试用例XML描述的Source视图
生成并检查服务测试
先前的请求序列可以转换为服务测试脚本:
- 在“请求历史记录”框中选择所有请求,然后单击“ 生成测试套件” :
图19.从请求历史记录生成服务测试
- 单击“ 新建项目”以创建一个容器项目,将服务测试重命名为
getTestCase
,然后单击“ 完成” 。 服务测试包含所有请求及其响应:
图20.测试中的请求和响应
通用服务客户端中使用的HTTPS配置已被检索并存储在测试中。
图21.测试中的HTTP配置
所有请求都使用HTTP配置:
图22.请求使用HTTP配置
自动数据关联使测试可运行
自动数据关联是Rational Performance Tester的强大功能。 使用此功能,无论通用服务客户端中方案的复杂性如何,都可以按原样立即运行服务测试。
在测试编辑器中,单击查看>显示数据关联 。 第一个替代者表明测试生成器通过第一个响应之后的请求检测到JSESSIONID cookie的使用。 替代者在响应中创建了对cookie的引用,并在此请求的后续请求中全部替换了它的值。
图23.测试中的数据关联
通过数据关联,在运行测试时,请求将使用服务器返回的JSESSIONID cookie,即使其值不是服务测试中存储的值。
验证点
在运行测试之前,您可以使用验证点检查上一个GET请求的状态。
要创建验证点:
- 单击查看>显示所有测试内容 ,然后选择最后一个响应。
- 单击添加>相等验证点 。
在运行时,此测试元素将服务器返回的XML消息与存储在测试中的XML消息进行比较。 其他比较选项也可用:
图24.设置相等的验证点
自定义Java代码
该验证点本身足以检查测试案例检索的状态。 但是,您可以使用另一个Rational Performance Tester功能来验证被测系统的其他方面:定制Java™代码。
例如,您可以检查响应的HTTP状态代码。 对于此过程,请使用最后一个响应并查看属性。
要将自定义Java代码添加到测试中:
- 打开“响应属性”页面:
图25.测试中的响应属性
状态代码为200
,表示“确定”。 在其余的步骤中,您将创建对此值的引用,并将其用作Java定制代码语句的参数。 在运行时,此代码检查实际状态是否等于200
,并相应记录通过或失败事件。
- 单击200值以提供价值焦点。
- 右键单击该值,然后选择“ 创建引用” 。
- 当“编辑引用名称”对话框提示您时,接受默认名称,然后单击“ 确定” 。
图26.创建对HTTP状态代码的引用
创建引用,编辑器以蓝色突出显示该值:
图27.测试编辑器突出显示参考
- 要将定制代码添加到测试中,请选择测试的根节点,然后单击添加>定制代码 :
图28.向测试添加定制代码
定制代码元素链接到项目中的Java类。
- 更改默认的类名称,使其具有以下含义:
test.CheckHTTPStatus
:
图29.更改定制代码名称
- 单击查看代码以生成该类,然后在编辑器中将其打开。 该类在运行时的行为由exec方法定义,该方法未指定:
public String exec(ITestExecutionServices tes, String[] args) {
return null;
}
- 更改内容,如下所示:
清单1.指定exec方法
public String exec(ITestExecutionServices tes, String[] args) {
if (args[0].equals("200")) {
tes.getTestLogManager().reportVerdict("Status code is
correct",VerdictEvent.VERDICT_PASS,VerdictEvent.REASON_SEE_DESCRI
PTION);
}
else {
tes.getTestLogManager().reportVerdict("Status code is not
correct",VerdictEvent.VERDICT_FAIL,VerdictEvent.REASON_SEE_DESCRIP
TION);
}
return null;
}
- 添加Java导入语句,这是识别
VerdictEvent
类所必需的:
import org.eclipse.hyades.test.common.event.VerdictEvent;
此代码检查自定义代码参数的值。 该值必须定义。
- 打开测试编辑器,然后单击自定义代码的“ 参数”字段旁边的“ 添加” 。 将打开“选择参数”对话框,您可以在其中选择数据源作为参数。
- 展开最后一个GET条目,然后选择Cookie:200参考; 然后单击“ 选择” 。
图30.向自定义代码添加一个参数
该引用将添加到自定义代码参数列表中:
图31.参数被添加到定制代码
- 保存测试,然后在测试编辑器中单击“运行” 。
分析测试结果
在测试运行期间,将自动打开并实时更新“服务测试”报告。 但是,此报告仅包含内置的相等验证点。 要获得测试运行事件的更精确视图,请在“性能测试运行”视图中右键单击运行结果,然后选择“ 显示测试日志” :
图32.显示“测试日志”报告
“测试日志”报告提供有关所有测试事件的高级信息。 要打开日志,请单击测试日志的“ 事件”选项卡,然后展开“ 事件树” :
图33.测试日志事件
相等的验证点是事件列表的一部分。 该日志还包括自定义代码记录的pass
事件。 选择通过事件将显示在Java自定义代码中为“通过”判决设置的文本字符串:
图34.定制代码状态文本字符串
查看“测试日志”报告时,“服务内容”页面将相应更新。 例如,它显示从上一个服务器响应接收到的XML消息:
图35.服务内容页面
“服务内容”页面还显示验证点的预期和实际XML内容:
图36.“服务内容”页面上的验证点
最后,“测试日志”报告显示后续请求使用了从服务器接收到的JSESSIONID cookie:
图37.服务器提供的JSESSIONID cookie
图38.请求使用的JSESSIONID cookie
定制服务测试以发出各种REST请求
要向Rational Quality Manager服务器发出其他请求,我们可以再次使用通用服务客户机,并通过服务器进行身份验证。 但是,一种更快的方法包括重新使用已经包含必要的身份验证步骤的服务测试。
- 在“测试导航器”中,右键单击测试,然后选择“ 复制” 。
- 将测试粘贴到项目中。
- 右键单击副本,选择“ 重命名” ,并将其命名为
createTestCase
。 - 要创建测试用例,必须使用POST操作将测试用例的完整XML表示发送到服务器。
- 在测试中,单击“ 传输”选项卡,然后在每个实例中将“ 方法”更改为
POST
而不是GET
。XML Test Case
而不是空消息)被发送到服务器。 - 更改URL以测试用例服务为目标:
https://rqmserver:9443/jazz/ service/com.ibm.rqm.integration.service.IIntegrationService/testcase)
- 在测试中,单击“ 传输”选项卡,然后在每个实例中将“ 方法”更改为
图39.更改请求的方法
- 要访问测试用例的XML表示形式:
- 选择最后一个响应以填充“服务内容”页面。
- 选择其所有内容并复制所选文本:
图40.从“服务内容”页面复制XML测试数据
- 将内容粘贴到上一个请求的消息的“源”视图中:
图41.将XML数据粘贴到请求消息中
您将内容粘贴到最后一个请求中,因为在用户认证之前将不会处理XML消息,因此,在对正确的URL发出实际的POST
请求之前,该内容是没有意义的。
此外,必须在第一个请求中更改URL。 可以通过使用引用来处理来自服务器的后续重定向。
要在第一个请求中更改URL:
- 单击第一个请求的“ 传输”选项卡。
- 使URL字段可编辑:右键单击该字段,然后选择删除替代 。
- 将URL更改为
https://rqmserver:9443/jazz/service/ com.ibm.rqm.integration.service.IIntegrationService/testcase
:
图42.更改URL
为响应此请求,服务器响应位置标头包含重定向URL。
- 在测试编辑器中选择重定向URL,右键单击所选内容,然后创建引用:
图43.使用重定向URL创建引用
- 命名参考
URL1.
- 重复这些步骤,以创建对第三和第四服务器响应的Location值的两个附加引用,并将响应命名为
URL2
和URL3
:
图44.使用第二个重定向URL创建引用
- 要使请求遵循这些重定向,请使用以下引用替换其各自的URL:
- 选择第二个请求URL的整个文本字段,右键单击,然后单击“ 替换”>“选择数据源” 。
- 选择URL引用,然后单击“ 选择” :
图45.选择数据源引用
- 重复步骤7,用URL2引用替换第四个请求的URL,用URL3替换第五个请求的URL。
- 从上一个响应中删除相等的验证点,因为它不再相关。
- 修改定制代码,以便检查以下状态:
201 – Created HTTP
:
if (args[0].equals("201")) {
tes.getTestLogManager().reportVerdict("Status code is correct",
VerdictEvent.VERDICT_PASS,VerdictEvent.REASON_SEE_DESCRIPTION);
}
- 将上一个
POST
请求中的测试用例的名称更改为新值:
图46.重命名新的测试用例
- 保存测试。
- 运行测试。 服务器Atom提要显示已创建的测试用例:
图47.更新的测试用例提要
结论
可以使用通用服务客户机来调用对Rational Quality Manager REST API的请求。 此外,可以生成,修改和运行包含该请求的服务测试。
以类似的方式,Rational Performance Tester可以使用通用服务客户端和测试编辑器的便捷功能,轻松地创建和调用使用其他命令(最主要是PUT
和DELETE
)的REST请求。
实际上,只要测试的持续时间不超过Rational Quality Manager会话超时,那么测试的所有请求都可以使用相同的JSESSIONID 。 每个服务测试仅需要根据本文中描述的过程进行一次身份验证,这可以大大简化测试方案的详细说明和维护。