使用 IBM Rational Performance Tester 对 FileNet Content Engine 进行负载测试

本文将介绍如何通过配置 IBM Rational Performance Tester 对 IBM FileNet Content Engine 的文档编辑功能进行负载测试。这种方法基于从大量内容的客户基准测试中学习到的经验,在这些测试中,首次使用了 Rational Performance Tester 来模拟文档编辑功能。本文对于试图评估 FileNet Content Engine 性能的软件开发人员和测试人员特别有用。

Venumadhav Vanagondi, 软件性能分析师, IBM

Venumadhav Vanagondi 的照片Venumadhav Vanagondi 拥有 5 年多的软件性能分析师工作经验。他曾与多个 IBM 客户合作解决性能问题,并能熟练使用性能评估、测试和监测工具。他从印度马德拉斯理工学院获得了计算机科学硕士学位。



Sanjay Singh, 高级软件架构师, IBM

Sanjay Singh 的照片Sanjay Singh 在设计和开发内容管理、电信和金融行业的高性能、可扩展的企业软件方面拥有 12 年的工作经验。过去五年一直效力于 IBM,是 IBM 印度软件实验室 ECM 团队中的一名高级成员。Sanjay 从印度坎普尔理工学院获得了技术学士学位。



Sandeep Vedula, 助理软件工程师, IBM

Sandeep Vedula 的照片Sandeep Vedula 在内容管理、在线学习和供应链管理的软件开发方面有大约 3 年的工作经验。在过去两年中,他一直效力于 IBM 的 ECM 团队。Sandeep 从海德拉巴中央大学获得了人工智能的硕士学位。



2012 年 6 月 08 日

免费下载:IBM® Rational® Performance Tester 试用版  |  IBM® Rational® 测试人员资源工具包
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

流程简介

IBM® FileNet® P8 软件在内容的存储和检索、业务流程自动化和案例管理等方面对企业均有帮助。FileNet Content Engine 是 IBM FileNet ECM 套件的核心组件,用于企业级内容管理。对于 FileNet P8 系统执行的多个任务,它可以作为一个非常强大的文档管理系统。用户可通过 Workplace 与 FileNet Content Engine 进行交互,Workplace 是一个 Java Enterprise Edition (JEE) 应用程序,提供了一个访问 FileNet Content Engine 的 Web 界面。

在内容管理系统中,文档编辑是其中一项主要任务。在 FileNet Content Engine 中,通过以下操作顺序执行编辑:

  1. 将文档从服务器签出到一个本地文件系统(类似于文件下载)。
  2. 使用一个文档编辑器在本地编辑并保存文档。
  3. 将文档重新签入 Content Engine 服务器(类似于文件上传)。

在内容管理系统中,签入和签出活动构成了系统上的大部分负载。因此,测试 FileNet Content Engine 的文件签入和签出活动成为系统整体性能评估的关键。

在本文中,我们介绍一种方法,配置 IBM® Rational® Performance Tester 以对 FileNet P8 Content Engine 进行负载测试。

配置 Rational Performance Tester 对 FileNet P8 Content Engine 的文档编辑过程进行负载测试,包括以下步骤。

  1. 创建测试脚本。
  2. 设置测试脚本参数,将变化性添加到负载测试。
  3. 修改测试脚本,获得正确的执行。
  4. 创建时间表并运行负载测试。

下文各节将详细描述这些步骤。


创建测试脚本

在 Rational Performance Tester 中创建一个测试脚本:

  1. 打开 Rational Performance Tester 工作台。
  2. 创建一个新的性能测试项目。

创建项目之后,您将看到提示,要从录制中创建一个新的测试脚本。

  1. 在弹出窗口中,选择 RPT HTTP Recording 作为记录器类型。将测试命名为一个适当的名称,并开始录制。

Rational Performance Tester 将打开默认浏览器 Microsoft Internet Explorer 来捕获请求。

  1. 访问 Workplace 应用程序,在浏览器中执行所需的操作,并通过关闭浏览器来停止录制。

这将生成一个测试脚本,其中包含与这些操作相应的 HTTP 请求。

提示:
请确保在测试脚本中将 HTTP 请求命名为有意义的名称。从 Rational Performance Tester V8.1 开始,您可以使用 Recorder Test Annotation 工具栏上的图标(图 1 圆圈中的白纸蓝笔图案),在录制测试脚本时将请求命名为适当的名称。

图 1. Recorder Test Annotation 工具栏
Internet Explorer 中的工具栏视图

注意:
在相同的测试脚本中捕获与签出和签入操作有关的行动。这种方法使得更容易在脚本中加入一个逻辑,确保只允许用户对他已经签出的文件执行一次签入操作。

在 Rational Performance Tester 中录制测试脚本时,应该执行以下操作:

  1. 通过在浏览器中输入相关的 URL 访问 Workplace,例如:
    http://testhost:9080/Workplace
  2. 使用相关的用户凭据登录 Workplace。
  3. 从主页中选择相关的对象存储,转到包含文档的文件夹。
  4. 要签出文档,就选中它并单击右键以访问操作菜单,选择 Check Out 操作。
  5. 在打开的新浏览器窗口中,下载已签出的文档并关闭窗口。
  6. 编辑已下载的文档。
  7. 要签入修改后的文档,选择已签出的文档,并单击右键以访问操作菜单,并选择 Check In 操作。
  8. 在打开的签入向导中,执行以下操作:
    1. 在 Set Properties 步骤,启用签入作为主版本,并保留所有其他属性的默认值。
    2. 在 Set Security 步骤,使用默认安全策略。
    3. 在 Select File 步骤,使用 Local File 选项,浏览并定位修改后的文档,然后单击 Finish
    4. 单击 OK 确认修改。这将关闭向导并签入文档。
  9. 注销 Workplace。

设置测试脚本参数

在签出请求中,您需要使用不同的版本系列 ID (version series ID),使测试脚本能够适用于不同的文档。

最新版本的文档总是被签出的文档。测试脚本将使用版本系列 ID 作为参考,而不是最新的文档版本。FileNet P8 Content Engine 将参考从版本系列 ID (version series ID) 修改为最新的文档版本,然后再将该文档签出。

  1. 利用不同文档的版本系列 ID 在 Rational Performance Tester 中创建一个数据池,这些文档存储在各自的文件夹和对象存储中。
  2. 您可以使用 FileNet P8 Content Engine client API,利用清单 1 中的 Java 代码片段从各自文档对象中检索这些值。
清单 1. 检索版本系列 ID 的代码
public Connection getConnection(String host, String port){
        //Build the FileNet connection URL
String filenetUrl = "http://" + host + ":" + port + "/wsi/FNCEWS40MTOM/";

 //Return the Connection to the caller 
 return Factory.Connection.getConnection(filenetUrl);
}

public void getDocAttributes(String host, String port, String userid,
 String passwd, String objStoreName, String folderPath)
{

 //FileNet P8 Admin user name and password
 String userName = userid;
 String password = passwd;
 boolean userPushed = false;

 try{
 /* Establish connection with the FileNet P8 Content Engine Server based
 * on host and port details
 */
 Connection conn = getConnection(host,port);
 Subject loginUser = UserContext.createSubject(conn,userName,
 password,"FileNetP8WSI");
 UserContext.get().pushSubject(loginUser);
 userPushed = true;

 //Access the Domain and ObjectStore information
 Domain gcd = Factory.Domain.fetchInstance(conn,null,null);
 String domainName = gcd.get_Name();
 ObjectStore objStore = Factory.ObjectStore.fetchInstance(gcd,objStoreName, null);

 /* Fetch the folder object that contains the documents
 * Get the document set in the folder and iterate
 */
 Folder folder = Factory.Folder.fetchInstance(objStore, folderPath, null);
 DocumentSet docSet = folder.get_ContainedDocuments();
 Iterator iter = docSet.iterator();
 Document currentDoc = null;
 String docTitle = null;
 String docId = null;
 String docVersionId = null;
 int majorVersion = -1;
 int minorVersion = -1;
 int versionStatus = -1;
 Versionable currentVersion = null;

 // versionid represents the version series id 
 System.out.println("doctitle,docid,versionid,majorversion,minorversion,
 versionstatus");

 //Retrieve the document properties from the current document object
 while (iter.hasNext()){
 currentDoc = (Document)iter.next();
 docTitle = currentDoc.get_Name();
 docId = currentDoc.get_Id().toString();
 currentVersion = currentDoc.get_CurrentVersion();
 majorVersion = currentVersion.get_MajorVersionNumber();
 minorVersion = currentVersion.get_MinorVersionNumber();
 docVersionId = currentVersion.get_VersionSeries().get_Id().toString();
 versionStatus = currentVersion.get_VersionStatus().getValue();
 System.out.println(docTitle + "," + docId + "," + docVersionId + ","+ 
 majorVersion + "," + minorVersion + "," + versionStatus);
 }
 }finally{
 if(userPushed)
 UserContext.get().popSubject();
 }
}

图 2 显示了在包含版本系列 ID 的测试脚本中的签出请求。

图 2. 带有版本系列 ID 的签出请求
jatarang.in.ibm.com:9080/Workplace/ooperations/...

在签出请求中,vsId 变量表示版本系列 ID(见图 3 签出请求的详细信息)。

  1. 用包含不同文档的版本系列 ID 的数据池替代这个变量值。
图 3. 签出请求的详细信息
在签出请求中的变量值替换

提示:
如果要在负载测试中添加更多变化,您可以修改测试脚本中的用户凭据、对象存储和文件夹相关的详细信息的值。


修改测试脚本

总是对保留版本的文档执行签入操作(保留版本表示一个已签出但尚未签入的文档版本)。为了签入操作可以正常执行,已签出的文档 ID 应该作为签入请求的输入。为了确保这一点,您可以使用 Rational Performance Tester 中的自定义代码特性,从 URL 解析和检索文档 ID,以响应签出请求。

在测试脚本中,签出响应包含一个要传递给自定义代码的自变量,如图 4 所示。

图 4. 签出响应包含一个要传递给自定义代码的自变量
签出响应包含一个要传递给自定义代码的自变量

清单 2 显示的 URL 包含最近签出文档的文档 ID,以响应签出请求。该 URL 应该作为一个自变量被传递给自定义代码。

清单 2. URL 详细信息

http://jaltarang.in.ibm.com:9080/Workplace/getContent?mode=download&objectType=document&id={753DFAA1-3EE5-4C44-89E3-51DEFFB7E371}&objectStoreName=mcs1db2&returnUrl=http%3A%2F%2Fjaltarang.in.ibm.com%3A9080%2FWorkplace%2FWcmCloseWindow.jsp%3Fop%3Dcheckout%26refreshUrl%3Dhttp%253A%2F%2Fjaltarang.in.ibm.com%253A9080%2FWorkplace%2FBrowse.jsp%253FwindowId%253DmainWindow%26eventName%3DStateChanged

清单 3 显示了用于解析和检索文档 ID 的自定义代码片段。

清单 3. 用于解析和检索文档 ID 的代码
public String exec(ITestExecutionServices tes, String[] args)
{
 int startIndex = args[0].indexOf("id=") + 3;
 int endIndex = startIndex + 38;
 tes.getTestLogManager().reportMessage(args[0].substring(startIndex,endIndex));
 return args[0].substring(startIndex,endIndex);
}

在测试脚本中,包含文档 ID 的签入请求如图 5 所示。

图 5. 包含文档 ID 的签入请求
测试脚本中包含文档 ID 的请求

在签入请求中,id 变量代表文档 ID(见图 6)。该变量值应该由自定义代码所返回的值替代。

图 6. 签入请求的详细信息
在签入请求中的变量值替换

注意:
为了在负载测试中增加多样性,您也可以修改被签入的文档内容。Rational Performance Tester v8.1.1 及更新的版本拥有一个内置的功能可以实现这一点。如需更多信息,请参阅标题为 “Rational Performance Tester: Substituting request content from a file”(在 参考资料 部分中引用)的 IBM TechNote。


创建时间表并运行负载测试

  1. 修改测试脚本之后,在 Rational Performance Tester 中创建一个时间表。
  2. 将测试脚本添加到该时间表。
  3. 指定所需的用户数量及爬升速度,并在所要求的时间内运行测试。

重要提示:

重要的是,在运行负载测试之后,要对所有相关文档执行取消签出操作。在大多数场景中,负载测试完成时,大部分虚拟用户会退出,而不会执行在测试脚本中的所有操作。这导致有很多文档处于签出状态。如果不执行这项清理活动,负载测试的下一次迭代将会报告很多错误。您可以使用清单 4 中所示的 Java 代码片段自动化执行文档的取消签出操作。

清单 4. 自动化取消签出操作的代码
public void deleteReservation(String host, String port, String userid,
 String passwd, String objStoreName, String folderPath)
{
 //FileNet P8 Admin user name and password
 String userName = userid;
 String password = passwd;
 boolean userPushed = false;

 try{
 /* Establish Connection with the FileNet P8 Content Engine Server
 * based on host and port details
 */
 Connection conn = getConnection(host,port);
 Subject loginUser = UserContext.createSubject(conn,userName,
 password,"FileNetP8WSI");
 UserContext.get().pushSubject(loginUser);
 userPushed = true;

 Domain gcd = Factory.Domain.fetchInstance(conn,null,null);
 String domainName = gcd.get_Name();

 //Fetch Object store, Folder and document set in the folder
 ObjectStore objStore = Factory.ObjectStore.fetchInstance(gcd,objStoreName, null);
 Folder folder = Factory.Folder.fetchInstance(objStore, folderPath, null);
 DocumentSet docSet = folder.get_ContainedDocuments();
 Iterator iter = docSet.iterator();
 Document currentDoc = null;

 /* Iterate through the document set, run cancel check out on the documents
 * and save the changes
 */
 while (iter.hasNext())
        {
currentDoc = (Document)iter.next();
 docTitle = currentDoc.get_Name();
 VersionSeries vs = currentDoc.get_VersionSeries();
 if(vs.get_IsReserved ())
 {
 Document resv = (Document) vs.get_Reservation();
 Versionable versionable = resv.cancelCheckOut();
 ((Document)versionable).save(RefreshMode.NO_REFRESH);
 System.out.println("reservation deleted for docTitle:" + docTitle);
 }
 }
 }finally{
 if(userPushed)
 UserContext.get().popSubject();
 }
}

在其他应用程序中使用这个流程

本文详细介绍了配置 IBM Rational Performance Tester 以对 FileNet Content Engine 的文档编辑功能进行负载测试的步骤。虽然本文重点介绍了 Rational Performance Tester,但其中包含的一些重要概念和构件也同样适用于其他负载测试工具。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=823662
ArticleTitle=使用 IBM Rational Performance Tester 对 FileNet Content Engine 进行负载测试
publish-date=06082012