最近对一个oracle ERP系统的INV模块进行性能测试,因为之前大部分都是测试web类型的应用,在这方面经验较少,期间也遇到了不少问题,因此有必要作些总结,以备后忘。首先先简单了解下测试对象相关的概念,oracle EBS、oracle ERP、oracle NCA等。

oracle应用系统相关概念

Oracle EBS

甲骨文公司的应用产品,全称是Oracle 电子商务套件EBS(E-Business Suit),是在原来Application(ERP)基础上的扩展,包括ERP(企业资源计划管理)、HR(人力资源管理)、CRM(客户关系管理)等等多种管理软件的集合,是无缝集成的一个管理套件。目前Oracle EBS已经发布R12(Release 12),是完全基于web的企业级软件(兼顾B/S和C/S的优点)。作为企业管理软件, EBS的管理范围涵盖企业管理的方方面面:资产生命周期管理、客户关系管理(CRM)、企业资源计划(ERP)、供应链管理(SCM)等等。

Oracle ERP

也就是oracle公司开发的企业资源计划管理软件,除了oracle公司做ERP外,业界还有ERP鼻祖德国的SAP公司以及国内的金蝶、用友等。oracle ERP系统分为企业管理和财务两大子系统,共有几十个模块。包括总帐管理(GL)、总帐管理(GL)、库存管理(INV)、销售&市场管理(SM)等等。另外关于oracle的产品名称,Oracle开发的database,就叫Oracle 10g Enterprise Databse,我们简称为 Oracle。它开发的application server,就叫Oracle Application Server,实际上也应该简称Oracle,为了区别,我们一般简称AS或Oracle AS。同样的道理,Oracle开发的ERP就叫Oracle ERP,简称还是Oracle。

Oracle NCA

Oracle NCA是一种基于Java的数据库协议。使用浏览器,可以启动数据库客户端(一个小程序查看器)。可以通过NCA数据库的小程序查看器对其执行操作,从而无需使用客户端软件,并可以从所有支持小程序查看器的平台执行数据库操作。有一个专门为模拟Oracle NCA客户端而设计的Vuser类型。NCA环境是一个三层环境。用户首先将一个HTTP调用从其浏览器发送到Web服务器。此调用将访问调用Oracle应用程序小程序的启动HTML页。该小程序在客户机上本地运行,所有后续调用都通过专用的NCA协议在客户端和Forms服务器之间传递。客户端(小程序查看器)与应用程序服务器(Oracle Forms服务器)进行通信,然后该服务器将信息提交到数据库服务器(Oracle 8.x)。VuGen录制并重播客户端和Forms服务器(应用程序服务器)之间的NCA通信。在录制Oracle NCA会话时,建议为Oracle NCA和Web协议创建一个多协议脚本。

  Oracle 3层架构数据库包括Java客户端、Web服务器和数据库:

基于LR的Oracle应用性能测试-LMLPHP

基于LR的Oracle应用系统性能测试

对于oracle ERP应用的性能测试,LR中提供了oracle NCA和oracle web application 11i协议,另外LR中还提供了Oracle(2-Tier)协议,Oracle(2-Tier)主要是对oracle数据库进行测试的,适于C/S结构和两层架构,例如使用sqlplus连接Oracle进行查询,就可以使用该协议进行录制。本文主要介绍oracle NCA和oracle web application 11i协议相关。

基于LR的Oracle应用性能测试-LMLPHP

协议选择

可以说Oracle Web Applications 11i是比Oracle NCA更高一层的协议,下图展示了几种web协议所处的层次,当我们录制脚本时一般优先选择较高层次的协议,如果不成功在选择其下面的协议。例如如果使用的第一个协议是Oracle Web Applications 11i,但它未能成功回放,那么接下来应尝试Oracle NCA 协议。本次测试ERP系统INV模块使用的就是Oracle Web Applications 11i协议,不过LR中录制的到的都是同一套nca函数,区别在于使用Oracle Web Applications 11i协议时除了录制到nca类型的请求函数外还可以录制到http的web请求,而如果单使用Oracle NCA 协议录制只能录制到nca的函数,web请求不会被录制到,所以一般oracle NCA都会与http协议一起使用。

基于LR的Oracle应用性能测试-LMLPHP

脚本录制

LR之前可以录制ERP R11及之前的版本。但自从ERP升级到R12后,LR无法录制其Form实现的功能,最新的Loadrunner11.0版本可以支持Oracle ERP R12的录制,但是使用中发现Oracle Application很难调起,我们在本次测试中起初也遇到了这个问题,不过后来是因为机器或本身系统的原因,从虚拟机换成配置较高点的物理机就成功调起来了。

对于录制有一些注意事项:

1)环境建议Win7 + LR11.00 + IE8,安装JDK1.5及以上,脚本录制过程请使用有线网络,无线网络不推荐。

2)在Java控制面板修改设置控制面板-》Java-》高级-》Java插件-》启用下一代Java插件取消。

3)如果对系统框架的脚本录制有经验,并做成了关联文件,可以导入关联文件并启用关联

在VuGen的录制选项中,注意选择“在录制期间启用关联”,钩选Oracle和OracleApps,其他项可不选择。在脚本生成后,VuGen将会自动完成nca_connect_server调用中参数icx_ticket的关联(当从普通web页面点击进入到form页面时一般都会存在icx_ticket的关联),请使用icx_ticket关键字进行搜索,以确保脚本中其他使用到icx_ticket的地方也正确关联了(VuGen可能会遗漏部分icx_ticket的关联)。

脚本调试

oracle NCA函数对象ID问题

LR中使用Oracle Web Applications 11i或oracle NCA协议,脚本中录制生成的大量oracle nca系列函数,如:nca_set_window("Discrete Jobs (H80)")、nca_obj_mouse_click("W_JOBS_M_WIP_ENTITY_NAME_0", 68, 18, 0)、nca_edit_set ("W_JOBS_M_WIP_ENTITY_NAME_0", "ABSDF12345")等完成诸如点击窗口、双击某个选项、编辑某个编辑框等之类的对象操作。另外也能录制到form界面上的键盘快捷键操作。相关函数如下:

基于LR的Oracle应用性能测试-LMLPHP基于LR的Oracle应用性能测试-LMLPHP

在不作处理的情况下,一般录制到的函数如nca_set_window("125")、 nca_obj_mouse_click("34", 68, 18, 0)等,可以看到这些函数的第一个参数为一个数字串,也就是对象ID,LR中就是利用这个对象ID来识别某个对象并完成相应的动作,但是对象ID是有服务器动态生成的,在多次迭代回放时可能会改变而出错,例如我们使用该协议会经常遇到的Window or object is not displayed(窗口或对象未找到)的错误可能就是因为这个原因造成的。

解决对象ID动态变化的问题是不使用对象ID而是用对象的逻辑名称,比如nca_set_window("Discrete Jobs (H80)")中的Discrete Jobs (H80)。具体在《Loadrunner11 Vugen 用户指南.pdf》的oracle NCA协议一节:如何启用按名称录制对象进行了较详细的方法介绍,比较简单的方法是直接在录制的URL后面增加?record=names,但不一定行的通,另外两种方法都需要有权限修改服务器端的配置文件:启动HTML文件或Forms 配置文件。

对于脚本回放时的Window or object is not displayed错误,除了上面提到的对象ID动态变化的情况外,比如使用的是对象逻辑名称还是报这个错误,可能是报错之前的脚本存在问题,如报错之前的web类型的请求代码未关联,导致没有正确进入到某个页面,从而造成后面的对象未找到。还有一个原因就是当前激活的并非对象所在的窗体,比如点击一个按钮nca_button_press("W_JOBS_QF_NEW_0"),按钮W_JOBS_QF_NEW_0在Calendar窗口上,而当前激活的是Discrete Jobs窗口nca_set_window("Discrete Jobs")从而导致对象未找到。因此对于oracle nca协议脚本中的函数前后顺序是很重要的,以及init、action和end块的划分也是需要考虑清楚的,而不像http协议的脚本那样,并行的请求之间前后顺序并不是很重要。

调试通过的脚本,在场景中进行多用并发压测时仍然可能遇到Window or object is not displayed错误,本次性能中很长时间一直都遇到幽灵一般的该错误,最后分析为参数化的数据问题,即由项目组提供的几千或上万条数据中存在一些无效的数据,导致脚本运行到使用这些无效数据时,没有打开正确的form界面,导致之后的nca函数操作都找不到对象而报出该错误。

oracle NCA协议的检查点函数

LR录制NCA协议和HTTP协议所用的函数还是有所不同的,在检查点函数方面,nca_obj_status和web_reg_find有类似功能。首先对象识别,返回对象的状态后进行判断;nca_console_get_text函数可以获取控制器返回的信息,然后可以用获取的信息与预期的信息比较以进行检查;nca_get_top_window函数可以获取当前最顶层的窗口的名称,如果某个操作成功后会弹出 后续的窗口,而失败时不会,则可以使用该函数进行检查。当然nca系列函数中还有一些函数可以用作检查点函数,这里的几个函数例子如下:

使用nca_console_get_text函数添加检查点:

 Action()
{
char console_text[1024];
     ...

nca_edit_press("W_JOBS_M_SCHEDULED_START_DATE_0"); lr_think_time(); nca_set_window("Calendar"); nca_button_press("CALENDAR_OK_0"); /*point save*/ lr_start_transaction("Define_Discrete_Job"); nca_set_window("Discrete Jobs (H80)"); nca_menu_select_item("Discrete Jobs", "File;Save"); nca_console_get_text(console_text); //lr_output_message("The console message was: %s", console_text); if(NULL != strstr(console_text,expected_console_text))
{
lr_end_transaction("Define_Discrete_Job", LR_PASS);
}
else
{
lr_end_transaction("Define_Discrete_Job", LR_FAIL); } //lr_end_transaction("Define_Discrete_Job", LR_AUTO); /*end*/ lr_think_time(); nca_win_close("Discrete Jobs (H80)"); return ;
}

使用nca_get_top_window函数添加检查点:

 Action()
{
    char topwin[1024]; ...
nca_set_window("Find Invoices"); /*point find*/ lr_think_time(); nca_edit_set("INVOICES_QF_INVOICE_NUM_0", "{Number}"); lr_think_time(); lr_start_transaction("Invoice_Match"); nca_button_press("INVOICES_QF_FIND_0"); nca_get_top_window(topwin); lr_output_message("Notify:topwin is %s",topwin); if( == strcmp(topwin,"Invoice Workbench"))
{
lr_end_transaction("Invoice_Match", LR_PASS);
}
else
{
lr_end_transaction("Invoice_Match", LR_FAIL);
}

return ;
}

LR中NCA协议的监控指标

在对NCA协议脚本压力测试过程中,一个业务查询的场景进行单场景500并发的压力测试,监控的HPS和Throughput除了在初始阶段有监控数据外,在迭代运行和结束阶段都没有的监控数据,即监控的数据为0,但是,整个过程中对应用服务器都产生了压力,为什么HPS和Throughput为0时对应用服务器仍然有压力?

分析原因,脚本中init块中存在http的web函数和nca类型的函数,而在action和end块中只有nca类型的函数,因此可知,LR中HPS和Throughput只会针对http类型的请求进行统计,而对于oracle NCA类型请求并没有统计数据,解决措施是在需要考察的nca业务操作前后添加事务函数,然后压测时观察TPS来进行分析。

04-30 04:31