• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    LoadRunner下DLL的調用

    發布: 2007-4-22 19:13 | 作者: 未知    | 來源: 網絡     | 查看: 833次 | 進入軟件測試論壇討論

    領測軟件測試網

    LoadRunner下DLL的調用
    這篇是LoadRunner測試的注意,可能跟開發沒關系,不過也是用C++編程,解決大家性能測試的問題,就發過來,希望給大家帶個新思想,如果有性能測試的問題,我還是能幫上忙的咯,呵呵
    場景介紹
    最近在做類似于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中進行封裝,以提高效率。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>