-
LoadRunner下DLL的调用
2007-01-25 19:47:23
场景介绍
最近在做类似于QQ的通信工具的性能测试时发现了一些问题,现总结出来与大家分享一下。希望大家在使用LoadRunner时不仅仅停在只是录制/播放角本,而全面提升角本的编程技术,解决复杂场景。
本次测试中碰到的问题是这样的,在消息的传送过程中遇到了DEC加密的过程,LoadRunner录制到的全是加密的消息,比如我录制了某一个用户的登陆,发送消息,退出,但由于是加密的,只能单个用户使用,但如果我想并发多少个用户就存在很多问题,最直接的一个问题就是用户名是加密的,密码是加密的,当然你可以说让程序那里注掉加密的代码进行明码的测试,当然也是一种办法。但程序组提出了要使用更真实的方法来模拟,这时就必需使用下面介绍的方法。
一开始是直接把API移植到LoadRunner中来,不过由于加密算法异常复杂,有几层循环,而角本是解释执行的,进行一次加密运算可能需要好几分钟,当然在角本里可以把角本本身运行的时间去掉,但这样做显然没有直接调用DLL来的效率高。由于程序组比较忙,所以无法提供DLL给测试,所以测试完成了DLL的编写,并在LoadRunner中调用成功,高效的完成了用户信息加密,参数关联,成功的完成了测试。
动态链接库的编写
在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library建立一个空的DLL工程。
1. Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库
每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 进程被停止、DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。
我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。
1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:
//MyDLL.h
extern "C" _declspec(dllexport) int desinit(int mode);
extern "C" _declspec(dllexport) void desdone(void);
extern "C" _declspec(dllexport) void des_setkey(char *subkey, char *key);
extern "C" _declspec(dllexport) void endes(char *block, char *subkey);
extern "C" _declspec(dllexport) void dedes(char *block, char *subkey);
//MyDll.cpp
#include"MyDll.h"
//这里我用了比较大小的函数代替了我要实现的函数
int desinit(int a, int b)
{
if(a>=b)return a;
else
return b;
}
int desdone(int a, int b)
{
if(a>=b)return b;
else
return a;
}
该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。
LoadRunner调用动态链接库
上面完成动态链接库开发后,下面就介绍动态链接库如何被LoadRunner进行调用,其实也是很简单的。在LoadRunner中的DLL调用有局部调用与全局调用,下面介绍局部调用。
首先把你编译的DLL放在角本路径下面,这里是MyDll.dll,MyDll.lib.然后在Action中使用
lr_load_dll("MYDll.dll"),此函数可以把DLL加载进来,让你调用DLL里面的函数,而DLL中的运算是编译级的,所以效率极高,代码样例如下:
#include "lrs.h"
Action()
{
//
int nRet = 6;
char srckey[129];
memset(srckey, 'a', 128);
lr_message(lr_eval_string(srckey));
lr_load_dll("MyDLL.dll");
nRet = desinit(5,8);
lr_message("比较的结果为%d",nRet);
return 0;
}
运行结果
比较的结果为8
全局的动态链接库的调用则需要修改mdrv.dat,路径在LoadRunner的安装目录下面(LoadRunner/dat directory);在里面修改如例:
[WinSock]
ExtPriorityType=protocol
WINNT_EXT_LIBS=wsrun32.dll
WIN95_EXT_LIBS=wsrun32.dll
LINUX_EXT_LIBS=liblrs.so
SOLARIS_EXT_LIBS=liblrs.so
HPUX_EXT_LIBS=liblrs.sl
AIX_EXT_LIBS=liblrs.so
LibCfgFunc=winsock_exten_conf
UtilityExt=lrun_api
ExtMessageQueue=0
ExtCmdLineOverwrite=-WinInet No
ExtCmdLineConc=-UsingWinInet No
WINNT_DLLS=user_dll1.dll, user_dll2.dll, ...
//最后一行是加载你需要的DLL
这样你就可以在LR中随意的调用程序员写的API函数,进行一些复杂的数据加密,准备的一些操作,进行复杂的测试。同时如果你觉的有大量高复杂的运算也可以放在DLL中进行封装,以提高效率。 -
WEB测试资料
2007-01-25 15:48:59
关于web测试
1页面部分
(1) 页面清单是否完整(是否已经将所需要的页面全部都列出来了)
(2) 页面是否显示(在不同分辨率下页面是否存在,在不同浏览器版本中页面是是否显示)
(3) 页面在窗口中的显示是否正确、美观(在调整浏览器窗口大小时,屏幕刷新是否正确)
(4) 页面特殊效果(如特殊字体效果、动画效果)是否显示
(5) 页面特殊效果显示是否正确
2 页面元素部分
(1)页面元素清单(为实现功能,是否将所需要的元素全部都列出来了,如按钮、单选框、复选框、列表框、超连接、输入框等等)
(2)素是否显示(元素是否存在)
(3)页面元素是否显示正确(主要针对文字、图形、签章)
(4)页面元素的外形、摆放位置(如按钮、列表框、核选框、输入框、超连接等)
(5) 页面元素基本功能是否实现(如文字特效、动画特效、按钮、超连接)
(6) 页面元素的容错性列表(如输入框、时间列表或日历)
(7) 页面元素的容错性是否存在
(8) 页面元素的容错性是否正确
3 功能部分
(1) 数据初始化是否执行
(2) 数据初始化是否正确
(3) 数据处理功能是否执行
(4) 数据处理功能是否正确
(5) 数据保存是否执行
(6) 数据保存是否正确
(7) 是否对其他功能有影响
(8) 如果影响其他功能,系统能否作出正确的反应
(9) 其他错误
(10) 对模块的具体功能进行测试时可以列出功能模块的所有功能,进行排列组合,测试所有情况
如:某一功能模块具有最基本的增删改查功能,则需要进行以下测试
单项功能测试(增加、修改、查询、删除)
增加——>增加——>增加 (连续增加测试)
增加——>删除
增加——>删除——>增加 (新增加的内容与删除内容一致)
增加——>修改——>删除
修改——>修改——>修改 (连续修改测试)
修改——>增加 (新增加的内容与修改前内容一致)
修改——>删除
修改——>删除——>增加 (新增加的内容与删除内容一致)
删除——>删除——>删除 (连续删除测试)
(11)查询功能分为两种情况,验证操作结果。
一、打开页面时自动显示结果,则不特别强调;
二、需要手工操作进行查询,则每次在其他功能完成后进行。
4 提示信息
(1) 成功、失败提示
(2) 操作结果提示
(3) 确认提示
(4) 危险操作、重要操作提示
(5) 返回页面 提示后显示的页面
5 容错性
注意以下几种情况
(1) 为空、非空
(2) 唯一性
(3 )字长、格式
(4) 数字、邮政编码、金额、电话、电子邮件、ID号、密码
(5) 日期、时间
(6) 特殊字符 (对数据库)英文单、双引号,&符号
6 权限部分
功能权限: 指定用户可以使用那些功能,不能使用那些功能
数据权限: 指定用户可以处理那些数据,不可以处理那些数据。可
以合并到功能测试
操作权限: 在逻辑关系上,操作前后顺序、数据处理情况。可以合
并到功能测试
权限变化: 可以合并到功能测试
(1) 功能权限是否存在
(2 )功能权限是否正确
(3) 数据权限是否存在
(4) 数据权限是否正确
(5)操作权限是否存在
(6) 操作权限是否正确
(7) 引起权限变化的功能列表
(8) 功能权限变化还是数据权限变化,或两者兼有
(9) 权限变化是否正确
7 键盘操作
(1) Tab键的使用
(2) 上下方向键的使用
(3) Enter键的使用
(4) 系统设定快捷键的使用(如果设置有快捷键)
8 测试中还应注意的其他事项
(6) 完整性:是否是一个整体,没有功能缺损
(7) 易用性:使用是否方便
(8) 一致性:类似的问题用类似的方法处理
(9) 提示信息:提示信息是否完整、正确、详细
(10) 帮助信息:是否提供帮助信息,帮助信息的表现形式(页面文字、提示信息、帮助文件),帮助信息是否正确、详细
(11) 兼容性:包括操作系统兼容和应用软件兼容,可能还包括硬件兼容
(12) 可扩展性:是否由升级的余地,是否保留了接口
(13) 稳定性:运行所需的软硬件配置,占用资源情况,出现问题时的容错性,对数据的保护
(14) 运行速度:运行的快慢,带宽占用情况
有几点:
1.功能点测试:是否满足需求所要求的功能
2.字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错.
3.字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错.
4.标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确.
5.中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错.
6.信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.
7.界面测试:界面的正确性、一致性、友好性、易用性。
用户界面测试是从最终的使用者用户的角度来看软件,软件难以理解,不易使用就是软件缺陷。可以从以下几个方面重点来检查用户界面:
1.易用性检查:确保软件易于理解,方便使用。
2.一致性检查:
a.注意系统页面的风格是否一致,如字的大小、颜色、字体要相同。
b.提示信息的表达方式是否一致。
c.按钮排列顺序是否一致。
d.back, cancel等按钮跳转页面处理是否一致。
e.各字段的名称,位置、长度、类型是否和设计文档要求一致,如Employee No和LoginName不一致。
3.正确性检查:检查页面上的form, button, table, header, footer,提示信息,还有其他文字拼写,句子的语法等是否正确。
4.友好性检查:
a.提示信息是否友好.
b.系统应该在用户执行错误的操作之前提出警告,提示信息.
c.页面分辨率检查,在各种分辨率浏览系统检查系统界面友好性。
5.合理性检查:做delete, update, add, cancel, back等操作后,查看信息回到的页面是否合理。
6.检查本地化是否通过:英文版不应该有中文信息,英文翻译准确,专业。
7.页面最大化检查:测试最大化/最小化/还原时页面是否做了对应的处理。 -
测试实施过程(Rational)(一)
2007-01-24 16:50:13
一、测试计划
定义测试输入条件,确定测试策略和划分测试功能点、设计测试用例规划,在此过程中还要考虑测试用例的属性和该测试是否进行迭代测试。
1.1计划目的
? 测试需求
? 测试策略
? 测试资源
? 测试进度
1.2确定内容:
? 必须进行那些测试?
? 测试在何时开始,希望何时通过以及测试日程安排;
? 测试在哪里进行?换句话说,就是测试将在何种软、硬件配置的环境下运行?
? 确定测试方法和测试工具;
1.3实施内容
1)、确定测试项目(中心员工综合打分系统)
2)、测试其基本功能的正确性(包括,登陆权限的验证,数据输入、输出格式的验证、添加、修改、更新、删除、以及可变因素的更改)
3)、确定测试策略和方法(针对功能正确性验证的测试)测试过程中录制相应测试脚本(包括手工脚本和自动化执行脚本)
4)、制定测试计划(2个小时)
5)、确定测试资源
1.4 计划预期目标
1)、用Administrator建立测试项目
2)、用RequisitePro 确定测试需求管理
3)、创建ClearQuest数据库
4)、创建测试用户和用户组
1.5具体操作
使用Rational Administrator建立测试项目
何建立一个内网共用的project的步骤总结下
1、 先创建web共享的文件夹,空的
2 、在Administrator建project,路径通过网上邻居指到上面那个文件夹
3、配置datastore,在此可以配置RequisitePro 用来确定对测试需求管理和创建ClearQuest数据库用来对以后发现的缺陷进行管理。
完成
4 、在Administrator里连到project,配账号,密码,分权限
5 、通知测试人员加入项目。
1.6 预期目标
1、使得学员了解测试计划的格式
2、能初步掌握测试计划的撰写工作;
启动Rational Administrator -
为什么婚戒要带在无名指上
2007-01-24 16:30:12
1,首先大家伸出两手,将中指向下弯曲,对靠在一起,就是中指的背跟背靠在一起。
2,然后将其它的4个手指分别指尖对碰。
3,在开始游戏的正题之前,请确保以下过程中,5个手指只允许一对手指分开。下面开始游戏的正题。
4,请张开你们那对大母指,大母指代表我们的父母,能够张开,每个人都会有生老病死,父母也会有一天离我们而去。
5,请大家合上大母指,再张开食指,食指代表兄弟姐妹,他们也都会有自己的家世,也会离开我们。
6,请大家合上食指,再张开小母指,小母指代表子女,子女长大后,迟早有一天,会有自己的家庭生活,也会离开我们。
7,那么,请大家合上小母指,再试着张开无名指。这个时候,大家会惊奇的发现无名指怎么也张不开,因为无名指代表夫妻,是一辈子不分离的。真正的爱,粘在一起后,是永生永世都分不开的。