在性能测试中坚难跋涉.

发布新日志

  • [转载]LoadRunner调用外部DLL的方法

    2007-07-25 10:41:20

    原文地址:http://blog.51testing.com/batch.viewlink.php?itemid=2315
     

    LoadRunner提供了功能强大的API集合,足够应付大多数性能测试的需求。但在某些情况下,这些API仍然有覆盖不到的地方。例如,我们有一个WEB应用,该应用有一个页面输入用户的信息,为了安全起见,用户输入的信息在提交之前都要先进行加密处理,加密处理通过本地的COM组件实现。

    对这个要求而言,LoadRunner的现有API不能提供直接支持,因为LoadRunner在录制脚本时只录制数据交互,因此,COM的加密处理过程是不能录制下来的。在LoadRunner的脚本中,可能只有类似以下的语句描述了这个过程:

    …………
    web_url("userinfo",
        "URL=http://testweb/userinfo.aspx",
        "TargetFrame=",
        "Resource=0",
         "Referer=",
         LAST);

    web_submit_form("login ",
    "Snapshot=t4.inf",
    ITEMDATA,
    "Name=username", "Value=4e92Sh6d394g", ENDITEM,
    "Name=password", "Value=932A2hf34U18", ENDITEM,
    LAST);
    …………

    从脚本可以看到,输入的数据是加密后的数据,但LR没有录制到加密过程。

    假设加密函数所在的DLL名为security.dll,用于加密的函数名为encode,则一种可能的对脚本的修改方法如下代码所示。
    …………
    char *encode_username, *encode_password, *orgin_username, *orgin_password;
    char* uservalue, passvalue;
    int ret;
    ……
    web_url("userinfo",
         "URL=http://testweb/userinfo.aspx",
         "TargetFrame=",
         "Resource=0",
          "Referer=",
          LAST);

    orgin_username = lr_eval_string(“{ username }”); //获取参数的值
    orgin_password = lr_eval_string(“{ password }”);

    ret = lr_load_dll(“security.dll”);   //加载DLL库

    encode(origin_username, encode_username);  //调用encode函数
    encode(origin_password, encode_password);


    sprintf(uservalue, “Value=%s”, encode_username);
    sprintf(passvalue, “value=%s”, encode_password);

    web_submit_form("login ",
      "Snapshot=t4.inf",
      ITEMDATA,
      "Name=username", uservalue, ENDITEM,
      "Name=password", passvalue, ENDITEM,
      LAST);
    …………

    ========================================================
    上述脚本中所使用到的函数的语法结构:
    sprintf
    Writes formatted output to a string.
    int sprintf ( char *string, const char *format_string[, args] );

    string
    The target string to which you write the data.
    format_string
    One or more formatting characters.
    args
    One or more optional print arguments.

    lr_load_dll
    Loads an external DLL.
    int lr_load_dll (const char *"library_name" );
    library_name
    The name of a DLL (Windows) or shared object (UNIX).

  • [转载]LR中“Simulate a new user on each iteration”设置项的作用

    2007-07-25 10:16:07

    昨天刚刚写了一篇关于cookie、Session、Cache的文章,今天就在关河的Blog里找到了一个与之相关的实例。大家可以结合起来看看,可能就会更明白了。

    原文地址:http://blog.51testing.com/batch.viewlink.php?itemid=2315

    LR中“Simulate a new user on each iteration”设置项的作用
    2005年12月14日14:07星期三  [LoadRunner]

    “Simulate a new user on each iteration”是LR的一个缺省设置项,曾经有人问过我该设置项的具体含义,当时按照LR手册上的说法描述了一下,但其实对这个选项带来的副作用并不十分明确。

    正好昨天部门的一个员工在用LR进行选型的性能测试时遇到问题,经过分析,问题的产生就和这个选项有关。

    昨天该员工在用LR对一个J2EE应用进行测试时,脚本录制修改和Play back都已经成功,但在controller里为脚本设置了100个VU,设置每个VU的迭代次数为20次,正确运行时应该在系统中生成2000条记录,但从controller里面看到,运行时这100个VU都只运行了一次,最终生成的只有100条记录。该员工百思不得其解,然后就向我求助。

    开始我以为该问题是由脚本错误引起的,但经过对脚本的调试,验证确实没有问题,而且,在VUG中回放该脚本,回放多次就能生成多条记录,看来脚本的correlation等应该没有问题。仔细检查Web Server的日志,发现该日志中有多个访问“timeout.jsp”的访问记录,询问开发人员得知,在session超时时会访问这个页面。

    HTTP协议本身是无状态的,因此为了保留住sessionid,一般的做法是用hidden field、cookie或是在URL上附加sessionid来解决这个问题,查看LR记录的页面访问数据,可以看到,该应用是用cookie解决这个问题的:

    接下来的问题就清楚了,猜想是在两次迭代之间LR清除了cookie,查看Runtime Setting的设置,果然“simulate a new user on iteration”选项被选中。

    取消该选项的选中,重新运行Controller中的Senario,结果正常。

  • Cookie、 Session、 Cache

    2007-07-25 09:54:18

    [ 前景提要 ] 在做性能测试时用LoadRunner自动录制角本时会出现记录Cookie的代码,在调整脚本要做关联而这通常必须要做关联的是一个叫作Session id的东东,而在Run脚本时又会有是否使用Cache的选项。让我对CookieSessionCache充满的疑问。只有了解它们的工作机制和不同,我们才能判断出它们对于性能测试的影响。于是乎就有了下面这篇文章了~~~

     

    一、  中文译名

    Ø         Cookie 小饼干? 偶用尽所有的方法都没有找到其中文译名, 就连偶一直非常信任的金山词霸对其也只是一段解释而非译名。(如果哪位高人能译出,请一定要告知金山公司让他们去更新词库)

    Ø         Session:会话

    Ø         Cache:高速缓冲存储器

     

    二、  工作机制

    Ø         Cookie:采用的是客户端保存信息的方案。

    Ø         Session:采用服务器端保存信息的方案。

    Ø         Cache:利用缓存SRAM来“静态”的保存写入信息的方案。

    如果上面的“专业”解释你还是不能明白,那我们就来“通俗”的解释它们吧!

     

             1 Cookie客户端的机制就是用户访问站点时,Web服务器发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie。用户的浏览器在获得页面的同时还得到了这个 Cookie,并且将它保存在用户硬盘上的某个文件夹中。

    Cookie是一段文本信息,你可以在你的电脑硬盘中找到许多这种文件,它们通常存放在C:\Documents and Settings\用户名\Cookies(早于Win2000以前的系统则会存放在c:\windows\Cookies)。

    那么Web服务器通过Cookie究竟写下了些什么呢?它们用有什么作用呢?

    这些就要看Web服务器的code如何写的了,不过你可以不必担心,服务器在Cookie里写下的信息只是为了你下次访问该站点时节约时间或提供一些特定的服务(绝非病毒或是其它可疑滴东东)。而且某些信息数据是加密的(例如密码等),当然也可以通过设置浏览器让它不记录下Cookie

    应用举例:一些要求用户登录的站点则可以通过 Cookie 来确定您是否已经登录过,这样您就不必每次都输入登录信息;一些站点的投票功能可以简单地利用 Cookie 作为布尔值,表示您的浏览器是否已经参与了投票,从而避免您重复投票。

     

    2 Session服务端的机制是将用户的请求信息放在服务器端来保存信息,服务器使用一种类似于散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用。

    保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。

    这就好像是我们去某些商店去买东西,如果你已是该店的会员,那么商店会给你一张会员卡,下次你再次光顾这家店时只要出示你的会员卡就可以享受订制的服务了。

    由于session只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对它的识别产生影响,这时就容易出现了我们常说的session混乱了。

    还是以上面会员店为例,如忘带会员卡或是会员卡上的照片已经是你好几年前的样子店员无法辨认,商店会重新给你办理一张会员卡。而此时其实你已经有两张会员卡了(session id)正好这两张卡的服务范围不一样(一张是普通卡,一张是VIP卡),当你再次去商店你任意的给了商店一张卡,这样你得到的服务有可能根本不是你想要的。

    当然如果程序写的好是可以避免这种混乱的情况,有时还可以是跨应用程序的session共享。

     

    3 Cache“静态”机制跟比起以上两种方式就特殊一些。为什么说它是“静态”,是因为它是有程序写入到SRAM里的,除非是重新写入数据或关闭电源,否则写入的数据是会保持不变的。

    由于CPU的存取数据速度比从内存和硬盘中存取数据的速度要快得多,从内存和硬盘中存取数据时会使CPU等待,影响计算机的速度。SRAM的存取速度比其它内存和硬盘都要快,所以它被用作电脑的高速缓存。

    有了高速缓存,可以先把数据预写到其中,需要时直接从它读出,这就缩短了CPU的等待时间。高速缓存之所以能提高系统的速度是基于一种统计规律,主板上的控制系统会自动统计内存中哪些数据会被频繁的使用,就把这些数据存在高速缓存中,CPU要访问这些数据时,就会先到Cache中去找,从而提高整体的运行速度。

     

    三、  生命周期区别

    Ø         Cookie

    如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
      如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。有些论坛在你登录时有记住登录信息1个月这类的时间选择,这就是为Cookie设置了过期时间。这时我们就算关闭了浏览器,再次打开访问这个论坛时仍然会是在线状态不需要再次登录。

    Ø         Session

    Cookie不一样,用户关闭浏览器Session仍然保存在服务器端,只要程序发出指令去删除session,服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。

    我们有时会误解当用户关闭浏览器时Session已经被删除,是由于大部分session机制都使用cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session

    Ø         Cache

    由于Cache的机制我们很明显的可以看出,只有关闭电脑电源或是让程序重写Cache。不然这个Cache将会一直存在。

  • [转] 测试的自我修养

    2007-05-23 13:04:55

    前人的帖子,前人的经验。初学者看了就感觉很受用。现给大家共享。

    1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。

    2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。

    3.看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,总觉得不够直观。

    4.不要被对象、属性、方法等词汇所迷惑;最根本的是先了解最基础知识。

    5.不要放过任何一个看上去很简单的小问题--他们往往并不那么简单,或者可以引伸出很多知识点;不会举一反三你就永远学不会。

    6.知道一点东西,并不能说明你会写脚本,脚本是需要经验积累的。

    7.学脚本并不难,JSP、ASP、PHP等等也不过如此--难的是长期坚持实践和不遗余力的博览群书。

    8.看再多的书是学不全脚本的,要多实践。

    9.把时髦的技术挂在嘴边,还不如把过时的技术记在心里。

    10.学习脚本最好的方法之一就是多练习。

    11.在任何时刻都不要认为自己手中的书已经足够了。

    12.看得懂的书,请仔细看;看不懂的书,请硬着头皮看。

    13.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;

    14.请把书上的例子亲手到电脑上实践,即使配套光盘中有源文件;

    15.把在书中看到的有意义的例子扩充;并将其切实的运用到自己的工作中。

    16.不要漏掉书中任何一个练习——请全部做完并记录下思路;

    17.当你用脚本到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个代码的完整性,然后分析自己的错误并重新编写和工作。

    18.别心急,写脚本确实不容易;水平是在不断的实践中完善和发展的;

    19.每学到一个脚本难点的时候,尝试着对别人讲解这个知识点并让他理解----你能讲清楚才说明你真的理解了。

    20.记录下在和别人交流时发现的自己忽视或不理解的知识点。

    21.保存好你做过的所有的源文件----那是你最好的积累之一。

    22.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的,首先你要学会自己找答案,比如google、百度都是很好的搜索引擎,你只要输入关键字就能找到很多相关资料,别老是等待别人给你希望,看的出你平时一定也很懒!

    23.到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问题早就有人问过了,你再问,别人已经不想再重复了,做为初学者,谁也不希望自己的帖子没人回的。

    24,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,如果你总期望有高手总无偿指点你,除非他是你亲戚!!讨论者,起码是水平相当的才有讨论的说法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你讨论呢。

    浮躁的人容易问:我到底该学什么;----别问,学就对了;

    浮躁的人容易问:测试有钱途吗;----建议你去抢银行;

    浮躁的人容易说:我要中文版!我英文不行!----不行?学呀!

    浮躁的人分两种:只观望而不学的人;只学而不坚持的人;

数据统计

  • 访问量: 7588
  • 日志数: 4
  • 建立时间: 2007-05-23
  • 更新时间: 2007-07-25

RSS订阅

Open Toolbar