zoukankan      html  css  js  c++  java
  • LoadRunner 使用介绍

    功能介绍

    安装流程

    LoadRunner是一款测试系统行为和性能的负债测试工具,通过模拟上千万用户实施并发复杂以实时性能监控的方式来确认和查找问题。它是一款付费商业软件,开发商为HP,个人开发者可以使用社区免费版,社区免费版最大支持50个用户并发,如果想要更多的就需要付费。
    Windows版本的LoadRunner运行依赖于一些其他组件,在安装时,会检测本机组件状态并联网下载必须组件

    如要允许LoadRunner自带例子,要求LoadRunner安装到默认目录,如果修改了默认安装路径,就无法使用。

    系统组件

    LoarRunner安装完成后,有三个组件,如图所示

    • Virtual User Generator(简称VuGen): 用于生成测试脚本,可以采用录制模式或者编辑模式来生成测试脚本(称为Vuser Script)
    • Controller:用来组织、驱动、管理和监视测试案例
    • Analysis:用于分析和图形化显示测试结果和报告

    工作流程

    1. 计划

      定义好测试目标和测试需求,预期待测试系统达到什么样的并发量,认为是合格系统

    2. 建立测试脚本

      通过录制或手动编写的方式,建立测试脚本

    3. 构建测试场景

      使用Controller来建立压力测试环境,并且管理和监视测试流程

    4. 分析结果

      使用Analysis来建立图形化的报告和评估系统性能

    使用方式

    VuGen有两种编写脚本的模式,录制模式和手动编写模式。录制模式,降低编写脚本的门槛,手动编写能够更加精确控制测试流程。

    录制模式

    VuGen通过录制用户在客户端软件的操作来直接生成脚本,用户每个协议级别的操作都会以LR的API函数方式记录在脚本中。回放脚本时,通过执行API函数来模拟用户最初的操作。

    录制模式有两种级别

    • HTML级别(默认级别)
    • URL级别

    HTML级别:会为隶属于一个页面的所有请求录制成一个单独的步骤(web_url),产生的脚本简洁直观,便于阅读。

    URL级别:为每个服务器对象的请求录制步骤,一个请求对应一个(web_rul)支持页面上的JavaApplets和ActiveX对象,对测试过程有更好的控制。

    一般来说,基于浏览器的应用程序使用HTML级别录制,不是基于浏览器的应用(比如API服务、DataServer服务)可使用URL级别的录制。如果基于浏览器的应用程序中包含了向服务器进行通讯的JS代码,或者基于浏览器的应用中使用HTTPS安全协议,也要使用URL级别录制

    实际案例

    使用URL-Mode录制方式访问网站https://www.baidu.com

    1. 创建脚本项目
      创建脚本

    2. 修改配置
      修改录制模式

    3. 设置录制参数
      设置录制参数

    4. 生成录制脚本

    录制脚本为空的解决方法:

    1. 关闭已打开的待测试浏览器

    2. 按照如下设置Recording Options-->Capture level--> 选择Socket Level Data或者选择Socket level and WinNet Level Data

    3. 打开HTTPS的网站,无法录制脚本。网上的处理方案

    4. 重置IE浏览器的高级设置

    脚本模式

    脚本模式,LR支持ANSI C语言,提供丰富的内置函数,帮助用户编写测试代码。除开通用的流程控制外,LR提供了参数化、关联、脚本模块化等高级功能。

    参数化

    参数化是将脚本中的常量转化为变量的过程,类似于随机数。LR中提供的随机变量种类非常丰富,具体设置如下:

    LR参数化设置详细说明

    遇到的问题:若使用参数化的VuGen脚本运行正常,而通过Controller启动,提示参数化错误,此处需要检查VuGen脚本参数化赋值方式。

    关联

    关联就是在响应数据中查找特定数据,将特定数据以参数的形式关联保存起来。例如一个登陆请求通常会返回SessionId,后续指令需要用到SessionId,那么就需要在响应数据中设定好关联规则和关联变量,以便在后续流程中使用。

    脚本模块化

    脚本模块化是抽取通用流程函数,提高测试脚本可读性和可重用性。

    LR无法通过包含头文件来引入具体的功能,原因是LR的C编译器将所有涉及到的程序文件都打包为一个pre_cci.cc文件,如果直接包含.h头文件,则在打包混合时,只会包含函数的定义,而没有实现部分,脚本中执行此函数会出错。

    解决方案:

    方法1:多文件编程,直接包含.c实现文件即可,无需.h文件。

    方法2:在Actions中右键再添加一个Action,假设命名为test,那么这个test.c中的test函数会被自动执行。

    辅助功能

    1. 事务相关

      在自动化测试过程中,需要统计一段代码执行所需时间,可使用LR提供的lr_strat_transactionlr_end_transaction来标记事务的事务名称以及开始和结束。每个事务度量服务器响应指定Vuser请求所需的时间,这些请求可以是简单的请求,也可以是复杂的请求。
      事务的开始点和结束点必须在同一个Action中,事务名称在脚本中必须是唯一,事务允许嵌套。

    2. 思考时间

      用户在执行两个连续操作期间等待的时间,称之为"思考时间",LR提供lr_think_time来设置等待时间(单位为秒),支持固定时间以及随机变动时间等模式。
      在测试脚本时,Run-Time Settings -> General -> Think Time 设置为不忽略思考时间,才会生效。

    3. 集合点

      为了模拟多用户并发操作,需要同步各个Vuser以便在同一时刻执行任务。通过创建集合点,可确保多个Vuser同时执行操作。当某个Vuser到达该集合点时,Controller会将其暂停,直到参与该集合的全部Vuser到达,Controller才允许Vuser执行。例如,同一时间,模拟100用户一同登陆,登陆操作前设置好集合点(lr_rendezvous)。

    4. 验证点

      在指定HTML文档中查找指定字符串是否存在,来检查此项操作是否成功。LR提供web_reg_find来实现此功能,此函数需要在请求数据前插入,类似的还有检查指定图片是否存在,LR提供web_image_check函数来完成此功能。

    5. 日志输出

      将测试过程中的相关信息输出到日志文件和输出窗口,方便查看运行信息,辅助问题定位,LR提供lr_output_messagelr_log_message等输出函数簇,具体参考LR帮助文档。

    6. 常用函数

      LR的通用函数以lr为前缀,可以在任何协议中使用,根据功能不同,分为信息相关、事务相关、运行相关、参数相关等。
      特定协议的函数,这类函数跟录制时创建的协议类型有关

      • Web协议:以web为前缀

      高级功能IP欺骗

    并发用户

    并发用户产生方式设置如下图:

    选择进程:场景运行时,会为每一个虚拟用户创建一个进程(mmdrv.exe),10个用户并发,就会有10个mmdrv.exe进程。

    选择线程:场景运行时,会将每一个虚拟用户创建一个线程,一个进程最多可以支持50Vu线程并发,当此方式设定的用户少于50,在任务管理器上只会看到一个进程。

    使用多线程的方式,可在单台机器上高效地发起更多的用户,但线程资源是从进程资源中分配出来的,同一个进程的多个线程会共享内存空间,可能会引起多个线程的同步问题。但只有支持线程安全的协议,才能使用LR的Vu并发方式。

    备注:使用多线程来模拟多个用户时,会受限于单一进程的资源限制,在实际测试时,会有一些Errors产生。

    这些错误原因通常是进程可用资源受限。

    C Vuser Scrpits

    LR支持纯C脚本模式,在C Vuser脚本模式下,可以使用标准ANSI C库函数和语法,LoadRunner内置的C编译器对C代码有以下要求:

    1. 支持标准ANSI C90语言,变量的定义必须要放在可执行代码之前,一旦在运行语句之间再有定义,会报错。

    2. Vuser脚本无法将某个函数的地址作为回调函数传递给库函数。

    3. Vuser不支持结构体参数或结构体返回值,指向结构体的指针是支持的。

    4. 字符串常量是只读的,任何尝试修改一个字符串常量都会触发访问异常。

    5. 一旦加载完DLL, 就可以立即使用其中的函数。

    Action()
    {
    	lr_load_dll("mydll.dll");	// 如果DLL放在脚本目录里面,可以直接写相对路径
    	myfun();		// myfun() define in mydll.dll. 
    }
    

    注意

    1. C Vuser模式中,不能直接使用web_url等内置的网络函数,如要使用,需要选择Web-HTTP/HTML类型的脚本。

    2. lr__load__dll加载dll不会自动加载其依赖的dll,因此,需要手动先将依赖的dll加载好,才能正确加载。

    3. 脚本的迭代数设置针对的是脚本内部的Action动作,比如说,设置为3,那么vuser_init执行1次,Action执行3次,vuser_end执行1次。在Action中进行for循环,也可以达到相同的功能

    4. 在VuUser中设置的迭代次数和在Controller中设置的迭代次数是两个不同的属性,前一个是在单独测试脚本时的迭代次数,后一个是通过并发用户去执行时设置的迭代次数。

    5. 如果想要在一个Vuser的一个Action中发起多个事务连接,那么在参数化设置时,就要选择Random+Each occurence的组合,可以达到目的。

      如果一个Vuser中一个Action中发起一次事务,那么在参数化设置时,可以配置Unique+Each occurence,每个Vuser分配一个值。或者是Random模式,不可配置为Sequential模式。

    6. 每次在Vuser中修改完脚本后,要在Controller组中选择待执行的组,右键Detail->Refresh->[Script + Runtimeing Setting],使得Controller中加载的是最新的测试脚本。

    场景控制器Controller

    Controller组件是LR的控制中心,用来进行场景设计和执行,在VuGen中编辑完脚本后,将脚本加载到Controller组件中,设计场景好后,即可执行该场景。

    Controller提供两种测试场景

    • 手动设计:能灵活按照需求来设计,使场景能更好的接近用户的真实使用。

    • 面向目标:测试性能是否达到预期目标。

    一般情况下,使用手动测试场景设计方法。

    场景设计

    手动配置

    手动配置有两种组织方法,按场景组织和按组组织

    按场景组织:所有用户统一按照相同的规则来跑完所有的测试脚本。

    按用户组组织:每个组要设置自己的启动规则、持续时间、停止规则等。

    默认的测试场景如上图:总计10个虚拟用户,以每15秒增加2个用户的方式进行加压,1分钟后加载完全部虚拟用户,持续增压5分钟,当结束的时候,每30秒停止5个用户,直到所有用户都停止。

    可以针对测试的各个阶段,进行更加精细的运行规则设置,下图以场景持续时间为例子,持续时间设置图如下:

    1. 选择"运行至结束",以Vugen中设置的迭代次数为准。
    2. 选择"持续时间",忽略Vugen中的迭代次数,脚本的Action重复执行,直到时间结束为止,按退出策略,执行退出操作。

    场景控制器中的并发数,指的是同时运行的VUser用户数,可在Tools-->LR License Utility中查看:

    社区版本最大可并发50个VUser,如果单次测试中超过50个Vuser,会弹提示

    解决方法:

    1. 在只有50个VUser的情况下,每个脚本内部采用循环的方式,执行相关的迭代操作,可在一定程度上跳过限制。如果在单个场景中,创建了太多的线程用户,LR会报错,报错示意图如下:

    2. 安装LR11.00破解版。

    面向目标的场景

    在此场景下,首先要定义预期目标,然后LR会根据这一目标自动创建场景,在运行过程中,会不断地把结果和目标相比较,以决定下一步怎么走。

    设置界面如下:

    常见的测试目标有:

    • 虚拟用户并发数
    • 每秒点击数
    • 每秒事务数
    • 多用户并发时的事务响应时间

    virtual users测试目标为例子,它用来测试服务器对并发用户的处理能力,假设虚拟用户有100个,那么LR会逐渐递增虚拟用户,直到加载到100个为之,如不能达到,将采取if target cannot be reached中设置的策略来继续运行当前的场景。

    参考链接:LR Controller介绍

    配置Load Generator

    Load Generator是负载发生器,默认情况下,使用本地的负载生产器来运行脚本,模拟用户行为本身需要消耗一定的系统资源,所以一台电脑上无法模拟大量的虚拟用户,此时,可通过多台机器上的Load Generator来完成大规模的性能负载。当控制器发出执行指令时,LG负责和其他负载机建立联系并强制负载机执行。

    详细介绍:Controller控制器

    LR中文参考教程:LoadRunner 12.02教程独家中文版

    执行完测试任务计划后,等待Controller自动收集各个负载生成器的数据后,可通过各式图表来查看测试报告。

    脚本调用DLL

    LoadRunner提供了lr__load__dll函数,可使用第三方dll。此种方法对dll有导出格式要求,要求导出风格为C风格。LoadRunner需要调用ANSI版本的Windows系统函数.

    遇到的问题:

    1. 创建C Vuser模式的脚本时,执行网络相关的函数(例如web_rul等)会卡死,可能是因为执行LoadRunner内置的网络相关函数,因为脚本的模式不对导致的。

    Controller结果分析

    设置好场景计划后,运行场景,如下图所示:

    左侧有可用图标提示:

    查看详细结果,可通过Results->Analysis Results打开Analysis软件来进行详细的分析。

    LR发送TCP数据流

    1. 发送数据在哪里定义?

    1.1 在data.ws文件中定义发送发送缓冲的内容和长度,定义接收缓冲的长度,采用这种方法,灵活性不好。

    1.2 通过lrs_set_send_buffer来自定义入参,可以选用Parameters List来填充。使用这种方法,需要注意一点,lrs_set_send_buffer函数的第三个入参表示传入的字节数,此处有坑:当自定义内容中无参数列表时,可以采用如下实现:

    	char* pSendBuffer = "123456789";	
    	lrs_set_send_buffer("socket2", pSendBuffer, strlen(pSendBuffer));
    	lrs_send("socket2", "sendBuffer", LrsLastArg);
    

    当自定义内容中含有自定义参数列表时,比如说传入随机数,参数名称起为Random,参数内容是1~10000之间的4位正整数,此时,第三格参数长度应该为{Random}字符串的长度,而不是真实传输内容的长度。

    	lrs_set_send_buffer("socket2", "{Random}", 8); 	// 设置为7,就会发送 "{Random"字符串,而不是参数化的信息
    	lrs_set_send_buffer("socket2", "{Random}", strlen("{Random}"));
    

    以上两种写法都可以,为了减少记忆负担,第三个参数始终使用strlen来计算待发送的长度。

    1. 接收数据在哪里查看?

    2.1 通过lrs_get_last_received_buffer来获得接收数据。

    1. 如何接收不定长数据?

    方法一

    分两次读取,第一次读取待接收数据流的长度信息,此长度信息的位置需要和服务端约定好。

    第二次根据第一次读取的长度来读取后续的内容。

    方法二

    通过lrs_set_receive_option函数来设置接收终止表示,该函数有三种使用方法:

    lrs_set_receive_option说明

    LR接收Mismatch问题的处理办法,自己在尝试时,发现EndMarket_None这种属性设置的没有效果,暂未测试成功。

    通过第二种方法,读取到指定结束符的方式来,也没有试成功。

  • 相关阅读:
    hdu1213
    [转]图论题集
    树剖题集
    【Python学习之旅】---线程的调用以及join方法
    【Python学习之旅】---自定制property
    【Python学习之旅】---描述符+装饰器应用
    【Python学习之旅】---类的装饰器
    【Python学习之旅】---描述符的应用
    【Python学习之旅】---上下文管理协议
    筱玛的迷阵探险(折半搜索+01字典树)
  • 原文地址:https://www.cnblogs.com/cherishui/p/9359883.html
Copyright © 2011-2022 走看看