收藏本站 收藏本站
积木网首页 - 技术学院 - 软件测试 - 网站黄页 - 常用手册 - 站长工具 - 技术社区
软件测试 > Rational > 正文

首页 | 领域细分: 游戏测试 安全测试 手机测试 Web测试 | 技术研究: 单元测试 入门教程 用例设计 性能测试 功能测试 | 测试职场: 面试精选 职场发展 面试试题

测试管理: 配置及流程 - 需求管理 - 质量验收 - 缺陷管理 - 其它管理相关 | 开发语言: PHP技巧 - PHP基础 - PHP实例 - PHP错误代码

测试工具: LoadRunner JiRa QuickTestPro RoBot WinRunner TestDirector 其它测试工具 | 数据库: Mysql数据库 Oracle数据库 CSS/DIV基础 HTML基础

(下)使用 Rational Functional Tester 进行应用软件系统级自动化性能测试

来源:互联网 日期:2012-10-18 20:30

使用 R ational Functional Tester 进行应用软件系统级自动化性 能测试(上)

 RFT Java Native API 的实现

  通过上述的操作,我们得到了被测软件的进程句柄并最终得到了进程的 CPU 时间和内存信息,但是,这些 API 的操作都是在 C++ 的环境下完成的,我们没有办法在 RFT 的 Java Script 中直接进行这些调用。因此我们需要把上述的操作封装成动态链接库,并通过 Java Native API 完成对动态链接库的调用,而最终在 RFT 的 Java Script 中得到进程的系统性能信息。

  Java Native Interface 允许 Java 程序调用本地用 C++ 等其它语言编写的程序或类库。我们将经过一系列的步骤来完成我们的 Java Native API。

  首先在 RFT 的 Java Script 代码 JavaNative_PerfmonWin.Java 中加上 JNI 的定义:

public native long getProcessorInfo(String processorName,String InfoType);

  编译通过生成对应的 class 文件后,在 class 文件的目录下执行:

Javah –jni JavaNative_PerfmonWin.class

  然后,会生成对应的 JavaNative_PerfmonWin.h 文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JavaNative_PerfmonWin */
#ifndef _Included_JavaNative_PerfmonWin
#define _Included_JavaNative_PerfmonWin
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JavaNative_PerfmonWin
* Method: getProcessorCPUTime
* Signature: (LJava/lang/String;LJava/lang/String;)J
*/
JNIEXPORT jlong JNICALL Java_JavaNative_PerfmonWin_getProcessorInfo
(JNIEnv *, jclass, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif

  这里声明的方法传递了一个 JNIEnv 指针、一个 jobject 指针和通过 Java 方法定义的 Java 参数(软件进程的名称和需要获取的信息)。

  我们依据 JavaNative_PerfmonWin.h 中的声明,实现:

extern "C" JNIEXPORT jlong JNICALL
Java_testcase_PVT_BenchMark_PVT_1Bench_1common_commTask_getProcessorInfo
(JNIEnv * env, jclass, jstring JprocessorName, jstring JInfoType){
……
……
}

  在函数中按照之前的描述对进程进行枚举,找到进程的 ID 并进而得到句柄,然后调用相应 API 得到并返回获取的进程 CPU 时间和内存等信息。

  其中,传入的 Java 参数需要进行转换:

const char* processorname = env->GetStringUTFChars(JprocessorName,0);
const char* Infotype = env->GetStringUTFChars(JInfoType,0);

  并且在用完后需要释放:

env->ReleaseStringUTFChars(JprocessorName,processorname);
env->ReleaseStringUTFChars(JInfoType,Infotype);

  整个程序的流程如下图 1 所示。

  代码编译通过生成动态链接库之后,我们在 RFT 的 Java Script 中加入:

请static{
System.loadLibrary("JNIperfmon_dll");
}

  并把动态库放到系统路径下,就可以完成调用了。

  在克服重重困难之后,我们终于获得了自定义的在 RFT 下访问软件进程的 CPU 占用时间,内存等系统性能数据的 API,之后的使用就简单得多了。

  在 RFT 的 Java Script 中,我们可以直接使用:

Long proCPU_USERTime = getProcessorInfo(“ProcessorName”,"CPUUserTime");

  来获取对应进程的 CPU,内存等性能信息。  自动化系统性能测试的流程及其扩展

  此后我们对应用软件某个操作的自动性能测试流程也非常的简单,在控制软件进行动作之前,记录软件进程的 CPU 占用时间和占用内存,然后用 Script 控制软件完成某个操作,如打开一个文档,保存修改过的文档或是其他一些复杂的操作,当检测到软件操作完成的某个判断标识发生改变或是等待足够长的时间以保证软件的操作完全完成后,再一次记录软件进程此时的 CPU 占用时间和占用内存,前后的数值相减,就可以得到软件这次操作所消耗的 CPU 时间和增加分配的内存了。如图 2 所示。

图 2. 自动化系统级性能测试流程图

  而更进一步的,我们甚至可以通过软件进程占用的 CPU 时间和系统 CPU 的主频,大致的换算出软件某次操作所执行的 CPU 指令数目:

  指令数量 = CPU 单周期执行指令数 * ( CPU 时间 * ( 1 / CPU 主频 ))

  假设我们的 CPU 主频是 1.4G HZ, 那么可以大致的认为 CPU 的一个时钟周期是 1S/1.4G=0.7μs,用软件进程某个操作所占的 CPU 时间假设是 230ms 除以这个值,便得到了软件进程在软件操作过程中占用的 CPU 周期数:328.6K 个,我们可以认为平均起来每个 CPU 时钟周期可以执行 2 条指令,那么软件在这个操作过程中所执行的 CPU 指令数大致就是占用的 CPU 周期数乘 2, 大约 657K 条指令了。

  有时我们会需要比较不同软件或是软件的不同版本之间的某个操作的性能,进行软件性能的评测或是保证软件开发过程中性能没有出现下降。但是由于某些客观条件的限制,我们会在不同频率的 CPU 主频计算机系统中进行测试,并得到测试数据。由于测试平台的计算机 CPU 本身性能就存在差异,因此即使得到的测试数据之间存在不同,我们也很难衡量这些被测软件的性能孰优孰劣。而通过上述的一个简单的换算,我们可以得到不同被测软件在这个操作时所耗费的 CPU 指令数,就能够进行统一的比较了。

  我们还可以计算软件进程的某段时刻 CPU 占用率 , 假设 t1 时刻进程的 CPU 时间为 pCPUTimet1,而 t2 时刻进程的 CPU 时间为 pCPUTimet2:

  pCPURate = (pCPUTimet1-pCPUTimet2)/(t2-t1)

  这样,我们就可以用进程 CPU 占用率达到某个数值作为软件完成某个操作的标识来衡量软件的操作性能。还甚至可以画出软件在操作过程中 CPU 占用率的曲线,而通过采用各种数学的方法分析曲线的斜率等变化情况则可以让我们对软件操作性能进行更进一步的分析。而在某些关注软件 IO 性能的情况下,我们也可以在目前代码的框架下,修改调用 GetProcessIoCounters 等 IO 相关的 API 函数,来获得对应的性能信息,完成软件的自动化系统级性能测试。

 总结

  通过上述的介绍,我们了解了如何扩展 RFT 的 API 来获取软件进程的 CPU 时间,内存等系统信息,包括进程 ID 的查找和句柄的打开,进程信息的获取,以及 RFT 中 Java Native API 的编写和调用这一整套的流程结构。在这个流程框架下,我们还可以进一步的扩展 API 的功能,获得所需的软件系统性能数据,为最终的软件性能分析和调优提供完善的数据支持。

相关阅读:

使用 Rational Functional Tester 进行应用软件系统级自动化性能测试(上)

利用 Rational Functional Tester 实现 ITCL (或者 IBM) 框架

使用Rational Functional Tester 测试应用软件的操作响应速度

对比使用 Rational Robot 和 Rational Functional Tester 进行软件测试

使用 IBM Rational Functional Tester 自动化定制控件

基于Rational Functional Tester 的测试脚本自动修复技术

扩展 Rational Functional Tester 的对象识别技术

使用 IBM Rational Functional Tester 实现全球化应用的自动化测试

使用Rational Functional Tester实现动态的校验点测试

定制用于数据驱动测试的 Rational Functional Tester 脚本

本周排行

别人正在浏览

强悍的草根IT技术社区,这里应该有您想要的! 友情链接:b2b电子商务
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP备05050695号