| 网站首页 | 测试咨讯 | 新手入门 | 专注性能 | 测试技术 | 测试管理 | 测试工具 | 开发社区 | 工具下载 | 资料下载 | 测试论坛 | 

[CNTester联盟群]交流群:34446273/21968356/64461572 白盒群:18400216 自动化群:2706508 性能群:4498858 外包群:59649884 管理群(需有管理经验):64442523

新手入门
 入门指南
 经验之谈
测试咨讯
 行业新闻
 网站动态
 人才就业
 CNTester基金
 标准规范
专注性能
 性能测试知识
 性能测试工具
 程序设计性能
 数据库性能
 Web应用服务器性能
 操作系统性能
 服务器与网络性能
测试技术
 用例设计
 性能测试
 自动化测试
 Web测试
 面向对象测试
 综合技术
 阶段性测试
 行业类测试
测试管理
 项目管理
 项目案例
 质量管理
 软件过程
测试工具
 Mercury系列
 Rational系列
 测试管理工具
 性能测试工具
 功能测试工具
 单元测试工具
 其它测试工具
开发社区
 Java技术
 DotNet技术
 C技术
 数据库技术
 操作系统
 服务器与中间件
工具下载
 测试工具
 开发工具
 企业工程
 网络通信
 媒体桌面
 游戏娱乐
 其他工具
资料下载
 测试资料
 程序设计
 数据库
 操作系统
 应用服务器
 电子期刊
 其他资料
 
 
您现在的位置: 中国测试员网站 >> 专注性能 >> 性能测试工具 >> Loadrunner >> 文章正文
  [组图]測試:軟件-LoadRunner-調用DLL         ★★★ 【字体:
測試:軟件-LoadRunner-調用DLL
作者:未知    文章来源:网络    点击数:    更新时间:2007-6-9    

最近小研了一把軟件測試,用了兩囘LoadRunner,發現它一個測試軟件居然還可以調用DLL,灰常灰常之不可以肆意,雖不是自己所作,卻也把它貼出來,共賞之~! 

 

場景介紹
    最近在做類似於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 DLLDllMain是一個缺省的入口函數,你不需要編寫自己的DLL入口函數,用這個缺省的入口函數就能使動態鏈接庫被調用時得到正確的初始化。如果應用程序的DLL需要分配額外的內存或資源時,或者說需要對每個進程或線程初始化和清除操作時,需要在相應的DLL工程的.CPP文件中對DllMain()函數按照下面的格式書寫。
(我注:熟悉DLL編程的同學這段就不必看了)
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;
}


    

//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;
    }

}

 

#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;
}

 



    這樣你就可以在LR中隨意的調用程序員寫的API函數,進行一些複雜的數據加密,準備的一些操作,進行複雜的測試。同時如果你覺的有大量高複雜的運算也可以放在DLL中進行封裝,以提高效率。

 
 
        [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
參數中,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.hMyDLL.cpp文件中分別輸入如下原代碼:        該動態鏈接庫編譯成功後,打開MyDll工程中的debug目錄,可以看到MyDll.dllMyDll.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中的運算是編譯級的,所以效率極高,代碼樣例如下:運行結果
        比較的結果為8

        全局的動態鏈接庫的調用則需要修改mdrv.dat,路徑在LoadRunner的安裝目錄下麵(LoadRunner/dat directory);在裏面修改如例:
文章录入:root    责任编辑:root 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
    最新热点 最新推荐 相关文章
    · mysql优化基础
    · MySQL服务器安装完之后如何调节性能
    · Mysql数据库管理系统优化方案
    · MySQL Performance Tuning Primer Script
    · MySQL 性能跟踪语句
    · Linux 和对称多处理
    · 应用与数据库性能测试解决方案,QUEST SO
    · 负载、性能测试和容量测试的关系和区别
    · LoadRunner监控Windows和Linux常见问题
    · 31个用来测试网站各项性能的免费工具
    · 应用与数据库性能测试解决方案,QUEST SO
    · 研究项目: JBoss架构分析
    · 如何通过 20% 的工作获得 80% 的性能改善
    · Linux 调度器内幕
    · 在 Linux 上利用数据分区功能提高可伸缩性
    · 降低 Linux 内存开销
    · Linux 和对称多处理 在 SMP 系统上发挥 L
    · 如何提高系统性能指标
    · Java 优化技术 充分挖掘 Java 应用程序性
    · 高速缓存和连接池对访问数据库性能的影响
    如何用命令行执行loadrunner
    測試:軟件-LoadRunner-判斷
    C语言应用于LR中-如何得到数
    LoadRunner下DLL的调用
    Mercury LoadRunner 产品简介
     
     
     
    ======> [CNTester联盟群]交流群:34446273/21968356/64461572 白盒群:18400216 自动化群:2706508 性能群:4498858 外包群:59649884 管理群(需有管理经验):64442523
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | 

    Copyright@2007 by CNTester.com 中国测试员网站 桂ICP备07005590

    本站为开源免费网站,非商业赢利性组织。本站文章部分从网络搜索获取,如果您认为某些侵犯了您的权益,麻烦您联系本站,我们会尽快删除相关内容,同时也希望您的谅解,我们的初衷是为了让更多人去学习这方面的知识,让行业有更好的发展。

    联系电话: 15021358905