起步于系统工程师,迈进入测试工程师,从起初的C/S系统到互联网时代的B/S系统,从事过电信增值业务、软交换、烟草OA、公安技侦和电子商务等行业的软件测试开发和管理多年,愿与大家共同分享共同交流,关注软件项目管理、测试团队管理、软件流程控制和软件性能测试及自动化测试技术。互联网时代,技术推动进步,欢迎人才推荐:jonas.wangl@alibaba-inc.com

发布新日志

  • LR监控计数器整理(二)

    2008-11-03 09:44:39

    Memory: 内存使用情况可能是系统性能中最重要的因素。如果系统“页交换”频繁,说明内存不足。“页交换”是使用称为“页面”的单位,将固定大小的代码和数据块从 RAM 移动到磁盘的过程,其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 能够使用比实际更多的内存,也是可以接受的,但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况,请从以下的对象计数器开始:
    Available Mbytes:可用物理内存数. 如果Available Mbytes的值很小(4 MB 或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。
    page/sec: 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放工作集空间的页面数。一般如果pages/sec持续高于几百,那么您应该进一步研究页交换活动。有可能需要增加内存,以减少换页的需求(你可以把这个数字乘以4k就得到由此引起的硬盘数据流量)。Pages/sec 的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。
    page read/sec:页的硬故障,page/sec的子集,为了解析对内存的引用,必须读取页文件的次数。阈值为>5. 越低越好。大数值表示磁盘读而不是缓存读。
    由于过多的页交换要使用大量的硬盘空间,因此有可能将导致将页交换内存不足与导致页交换的磁盘瓶径混淆。因此,在研究内存不足不太明显的页交换的原因时,您必须跟踪如下的磁盘使用情况计数器和内存计数器:
    Physical Disk\ % Disk Time
    Physical Disk\ Avg.Disk Queue Length
    例如,包括 Page Reads/sec 和 % Disk Time 及 Avg.Disk Queue Length。如果页面读取操作速率很低,同时 % Disk Time 和 Avg.Disk Queue Length的值很高,则可能有磁盘瓶径。但是,如果队列长度增加的同时页面读取速率并未降低,则内存不足。
    要确定过多的页交换对磁盘活动的影响,请将 Physical Disk\ Avg.Disk sec/Transfer 和 Memory\ Pages/sec 计数器的值增大数倍。如果这些计数器的计数结果超过了 0.1,那么页交换将花费百分之十以上的磁盘访问时间。如果长时间发生这种情况,那么您可能需要更多的内存。
    Page Faults/sec:每秒软性页面失效的数目(包括有些可以直接在内存中满足而有些需要从硬盘读取)较page/sec只表明数据不能在内存的指定工作集中立即使用。
    Cache Bytes:文件系统缓存(File System Cache),默认情况下为50%的可用物理内存。如IIS5.0 运行内存不够时,它会自动整理缓存。需要关注该计数器的趋势变化
    如果您怀疑有内存泄露,请监视 Memory\ Available Bytes 和 Memory\ Committed Bytes,以观察内存行为,并监视您认为可能在泄露内存的进程的 Process\Private Bytes、Process\Working Set 和Process\Handle Count。如果您怀疑是内核模式进程导致了泄露,则还应该监视 Memory\Pool Nonpaged Bytes、Memory\ Pool Nonpaged Allocs 和 Process(process_name)\ Pool Nonpaged Bytes。
    Pages per second :每秒钟检索的页数。该数字应少于每秒一页。
  • LR监控计数器整理(一)

    2008-11-03 09:41:55

    监视IIS需要的一些计数器


    Internet Information Services Global:
    File Cache Hits %、File CacheFlushes、File Cache Hits
    File Cache Hits %是全部缓存请求中缓存命中次数所占的比例,反映了IIS 的文件缓存设置的工作情况。对于一个大部分是静态网页组成的网站,该值应该保持在80%左右。而File Cache Hits是文件缓存命中的具体值,File CacheFlushes 是自服务器启动之后文件缓存刷新次数,如果刷新太慢,会浪费内存;如果刷新太快,缓存中的对象会太频繁的丢弃生成,起不到缓存的作用。通过比较File Cache Hits 和File Cache Flushes 可得出缓存命中率对缓存清空率的比率。通过观察它两个的值,可以得到一个适当的刷新值(参考IIS 的设置ObjectTTL 、MemCacheSize 、MaxCacheFileSize)
    Web Service:
    Bytes Total/sec:显示Web服务器发送和接受的总字节数。低数值表明该IIS正在以较低的速度进行数据传输。
    Connection Refused:数值越低越好。高数值表明网络适配器或处理器存在瓶颈。
    Not Found Errors:显示由于被请求文件无法找到而无法由服务器满足的请求数(HTTP状态代码404) 

  • ramp down的作用

    2008-11-02 22:04:25

    ramp down有助于检测内存泄露和系统恢复
  • 【转】LR的Apache的监控

    2008-11-02 22:03:06

    具体配置如下:
    配置LoadRunner监控Apache,LoadRunner监控Apache服务器是调用的Apache自身的模块进行监控的,所以需要配置Apache和LoadRunner

    一.配置LoadRunner
    1.在图树中单击 Apache 图,并将该图拖进“运行”视图的右窗格中。
    2.右键单击该图,然后选择“添加度量”,或选择“监视器”>“添加联机度量”。
    3.在“Apache”对话框的“监视的服务器计算机”部分,单击“添加”输入要监
    视计算机的服务器名或 IP 地址。选择计算机运行的平台,单击“确定”。
    4.在“Apache”对话框的“资源度量”部分中,单击“添加”选择要监视的度量。
    将打开“Apache - 添加度量”对话框,显示可用的度量和服务器属性。
    5.在“服务器属性”部分,输入端口号和不带服务器名的 URL,并单击“确定”。
    默认的 URL 是 /server-status?auto。
    6.在“Apache”对话框中单击“确定”,激活监视器。
    二.配置Apache
    1.修改Apache中Httpd.conf文件,添加如下代码(该文件中都有,只要取消注释就好了)
    <Location /server-status>
        SetHandler server-status
        Order deny,allow
    #    Deny from all
        Allow from .localhost
    </Location>
    2.添加 ExtendedStatus
      设置  ExtendedStatus On
    3.取消注释LoadModule status_module modules/mod_status.so
       加载该模块。
    4.重新启动Apache 
    备注:因为51testing网站也是用apache,这里正好借着解决51testing学员的问题而在这里发布, 转自学员专版 连接 http://bbs.51testing.com/forumdisplay.php?fid=118&page=1
  • Disktime

    2008-11-02 22:01:33

    Disktime要求在命令行输入diskperf -y
  • LR脚本的调试详细介绍

    2008-11-02 21:32:44

    沉浮于LR很多天了,以前一直在WR分论坛漂。看到大家提出很多问题,不过发现大家的脚本大都已录制为主,而且经常有提出录制的脚本回放有问题,其实很多问题很好解决,LR提供了很多手段调试和优化我们的脚本。  1.设置断点
      相信大家都不陌生,LR也是可以设置断点的,在需要设置断点的语句前按F9快捷键,断点就设置好了,程序运行到断点语句后会暂停,这时我们可以用F10单步调试程序.
      2.打开EXtended Log
      只是设置断点是不够的,我们还得知道具体发生了什么事情,Log告诉了我们一切,默认的Log是standard Log,这时远远不够的.我们要extended log,打开路径为runtime settings-->log-->extended log.把parameter substitution和data returned by server和advanced trace大家根据需要勾选吧.
      3.注释掉多余的语句
      很多回放时出错的脚本都是因为多余的语句.因为LR在录制的时候,LR生成的语句很多不是我们想要的,这里结合几个网友的问题说说,曾有网友问:回放脚本的时
    候socket出错,提示: Error : socket0 - Address already in use. Error code: 10048.而且非常坚持说脚本不会有问题,因为脚本直接录制后回放,什么都没改,是不会出错的.拿到脚本一看,有一条语句lrs_create_socket,建立了socket0,但是之后没有任何socket0的语句,可以判断出该语句是无效的,注释掉,问题解决。所以大家不要过分相信LR了,它生成的语句也是有很多BUG的。
      经常有朋友们问到,log文件在哪看,特别是controll执行后,怎么看log。这里一一说明一下:
      (1)在vgen中,我们必须写输出函数输出信息,将我们所想要了解的信息用函数输出,主要有这么几个函数输出信息:lr_output_message,lr_error_message,lr_log_message。这些函数请参阅help-->function reference.
      其次,我们要在runtime settings中设置,勾选always send messages,具体的做法是:runtime settings--->log-->always send messages,这样我们才能写出Log,在我们的脚本所在的文件夹中,有两个文件很重要,mdrv.log.txt和output.txt文件,lr_log_message只会把信息输到mdrv.log文件中,而lr_output_message则会写进以上两个文件。
      (2)在controller中,很多朋友都会想知道多次迭代,参数是否正确的导入了呢,我们依旧查看log,我们在执行结束后,查看结果目录的Log文件夹,如果是负载生成器运行的话,则在tmp目录。不过,还想提醒朋友们,在controller我们也要设置runtime settings才行,而且每个用户组的runtime settings,设置的方法是:在controller的design标签页中,右下角的部分有runtime settings按钮,我们点击它,设置的方法与在vgen中一样的。
  • LR中自动显示函数语法

    2008-11-02 21:14:59

    Auto show function syntax:语句完全打出后,再打(可自动显示函数的用法(参数及回值类型)。
    Auto complete word:打出函数第一小段再加_(可自动显示函数列表)
  • LR算当前时间

    2008-11-02 20:47:38

    Action()
    {
    typedef long time_t; 
    time_t t; 
    
         /* Get system time and display as number and string */ 
    
         lr_message("Time in seconds since 1/1/70: %ld\n", time(&t)); 
    
         lr_message("Formatted time and date: %s", ctime(&t)); 
    
    return 0;
    }
  • 【转】LoadRunner下Dll的调用

    2008-11-02 20:41:41

       一个LR下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 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中进行封装,以提高效率。

  • atol类型转换字符串转成整型

    2008-11-02 20:33:11

    Action()
    {
    char a[512];
    lr_output_message("value:%s",lr_eval_string("{param1}"));
    sprintf(a,"value=%ld",atol(lr_eval_string("{param1}"))+1);
    lr_output_message("value:%s",a);
    return 0;
    }
    atoi是转回来
  • lr_eval_string的使用

    2008-11-02 20:26:42

    lr_error_message(lr_eval_string("{NewParam_1}"));
    lr_error_message(lr_eval_string("Seco
    nd{NewParam_1}"));
312/2<12
Open Toolbar