发布新日志

  • 负载测试、压力测试和性能测试的异同

    2009-06-06 14:29:14

    此文属于转载

    负载测试(Load testing)、压力测试(Stress Test,应称为强度测试)和性能测试,这三个概念常常引起混淆,难以区分,从而造成不正确的理解和错误的使用。之前,也有不少讨论,比较有名的,应归为Grig Gheorghiu's的两篇博客:

    • Performance vs. load vs. stress testing
    • More on performance vs. load testing

         负载测试、压力测试和性能测试的测试目的不同,但其手段和方法在一定程度上比较相似,通常会使用相同的测试环境和测试工具,而且都会监控系统所占用资源的情况以及其它相应的性能指标,这也是造成人们容易产生概念混淆的主要原因。
         我们知道,软件总是运行在一定的环境下,这种环境包括支撑软件运行的软硬件环境和影响软件运行的外部条件。为了让客户使用软件系统感到满意,必须确保系统运行良好,达到高安全、高可靠和高性能。其中,系统是否具有高性能的运行特征,不仅取决于系统本身的设计和程序算法,而且取决于系统的运行环境。系统的运行环境会依赖于一些关键因素,例如:

    • 系统架构,如分布式服务器集群还是集中式主机系统等。
    • 硬件配置,如服务器的配置,CPU、内存等配置越高,系统的性能会越好。
    • 网络带宽,随着带宽的提高,客户端访问服务器的速度会有较大的改善。
    • 支撑软件的选定,如选定不同的数据库管理系统(Oracle、MySQL等)和web应用服务器(Tomcat、GlassFish、Jboss、WebLogic等),对应用系统的性能都有影响。
    • 外部负载,同时有多少个用户连接、用户上载文件大小、数据库中的记录数等都会对系统的性能有影响。一般来说,系统负载越大,系统的性能会降低。

         从上面可以看出,使系统的性能达到一个最好的状态,不仅通过对处在特定环境下的系统进行测试以完成相关的验证,而且往往要根据测试的结果,对系统的设计、代码和配置等进行调整,提高系统的性能。许多时候,系统性能的改善是测试、调整、再测试、再调整、……一个持续改进的过程,这就是我们经常说的性能调优(perormance tuning)。
        在了解了这样一个背景之后,就比较容易理解为什么在性能测试中常常要谈负载测试。从测试的目的出发、从用户的需求出发,就比较容易区分性能测试、负载测试和压力测试。性能测试是为了获得系统在某种特定的条件下(包括特定的负载条件下)的性能指标数据,而负载测试、压力测试是为了发现软件系统中所存在的问题,包括性能瓶颈、内存泄漏等。通过负载测试,也是为了获得系统正常工作时所能承受的最大负载,这时负载测试就成为容量测试。通过压力测试,可以知道在什么极限情况下系统会崩溃、系统是否具有自我恢复性等,但更多的是为了确定系统的稳定性。
         那么,如何给负载测试、压力测试下个定义呢?根据上述讨论,我们可以给出如下的定义:

    • 负载测试是模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题。负载测试更多地体现了一种方法或一种技术。
    • 压力测试是在强负载(大数据量、大量并发用户等)下的测试,查看应用系统在峰值使用情况下操作行为,从而有效地发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。压力测试分为高负载下的长时间(如 24小时以上)的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试。

         压力测试可以被看作是负载测试的一种,即高负载下的负载测试,或者说压力测试采用负载测试技术。通过压力测试,可以更快地发现内存泄漏问题,还可以更快地发现影响系统稳定性的问题。例如,在正常负载情况下,某些功能不能正常使用或系统出错的概率比较低,可能一个月只出现一次,但在高负载(压力测试)下,可能一天就出现,从而发现有缺陷的功能或其它系统问题。通过负载测试,可以证明这一点,某个电子商务网站的订单提交功能,在10个并发用户时错误率是零,在 50个并发用户时错误率是1%,而在200个并发用户时错误率是20%。
        负载测试是为了发现系统的性能问题,负载测试需要通过系统性能特性或行为来发现问题,从而为性能改进提供帮助,从这个意义看,负载测试可以看作性能测试的一部分。但它们两者的目的是不一样的,负载测试是为了发现缺陷,而性能测试是为了获取性能指标。因为性能测试过程中,也可以不调整负载,而是在同样负载情况下改变系统的结构、改变算法、改变硬件配置等等来得到性能指标数据,从这个意义看,负载测试可以看作是性能测试所c的一种技术,即性能测试使用负载测试的技术、使用负载测试的工具。性能测试要获得在不同的负载情况下的性能指标数据。
        通过负载测试和压力测试都可以获得系统正常工作时的极限负载或最大容量。容量测试,自然也是采用负载测试技术来实现,而在破坏性的压力测试中,容量的确定可以看作是一种副产品——间接结果。
        综合所述,负载测试、压力测试和性能测试的概念可以概括如下:

    • 负载测试是通过改变系统负载方式、增加负载等来发现系统中所存在的性能问题。负载测试是一种测试方法,可以为性能测试、压力测试所采用。负载测试的加载方式也有很多种,可以根据测试需要来选择。
    • 性能测试是为获取或验证系统性能指标而进行测试。多数情况下,性能测试会在不同负载情况下进行。
    • 压力测试通常是在高负载情况下来对系统的稳定性进行测试,更有效地发现系统稳定性的隐患和系统在负载峰值的条件下功能隐患等。
  • LR对Apache服务器上的资源监控

    2008-09-04 13:54:55

    此文摘自于涌所著的<<软件性能测试与LR实战>>

    配置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。

    其它的设置同添加windows监控资源一样,这里不再讲述。

  • return

    2008-09-04 13:16:10

    在LoadRunner的脚本中,return+大于等于零的数字,表示成功,反之,则表示失败。

  • loadrunner 参数英汉对照

    2008-09-03 23:08:13

    此文转自http://www.51testing.com/?130702中的文章!

    LR函数:
    lr_start_transaction 为性能分析标记事务的开始
    lr_end_transaction 为性能分析标记事务的结束
    lr_rendezvous 在 Vuser 脚本中设置集合点
    lr_think_time 暂停 Vuser 脚本中命令之间的执行
    lr_end_sub_transaction 标记子事务的结束以便进行性能分析
    lr_end_transaction 标记 LoadRunner 事务的结束
    Lr_end_transaction("trans1",Lr_auto);
    lr_end_transaction_instance 标记事务实例的结束以便进行性能分析
    lr_fail_trans_with_error 将打开事务的状态设置为 LR_FAIL 并发送错误消息
    lr_get_trans_instance_duration 获取事务实例的持续时间(由它的句柄指定)
    lr_get_trans_instance_wasted_time 获取事务实例浪费的时间(由它的句柄指定)
    lr_get_transaction_duration 获取事务的持续时间(按事务的名称)
    lr_get_transaction_think_time 获取事务的思考时间(按事务的名称)
    lr_get_transaction_wasted_time 获取事务浪费的时间(按事务的名称)
    lr_resume_transaction 继续收集事务数据以便进行性能分析
    lr_resume_transaction_instance 继续收集事务实例数据以便进行性能分析
    lr_set_transaction_instance_status 设置事务实例的状态
    lr_set_transaction_status 设置打开事务的状态
    lr_set_transaction_status_by_name 设置事务的状态
    lr_start_sub_transaction 标记子事务的开始
    lr_start_transaction 标记事务的开始
    Lr_start_transaction("trans1");
    lr_start_transaction_instance 启动嵌套事务(由它的父事务的句柄指定)
    lr_stop_transaction 停止事务数据的收集
    lr_stop_transaction_instance 停止事务(由它的句柄指定)数据的收集
    lr_wasted_time 消除所有打开事务浪费的时间
    lr_get_attrib_double 检索脚本命令行中使用的 double 类型变量
    lr_get_attrib_long 检索脚本命令行中使用的 long 类型变量
    lr_get_attrib_string 检索脚本命令行中使用的字符串
    lr_user_data_point 记录用户定义的数据示例
    lr_whoami 将有关 Vuser 脚本的信息返回给 Vuser 脚本
    lr_get_host_name 返回执行 Vuser 脚本的主机名
    lr_get_master_host_name 返回运行 LoadRunner Controller 的计算机名
    lr_eval_string 用参数的当前值替换参数
    lr_save_string 将以 NULL 结尾的字符串保存到参数中
    lr_save_var 将变长字符串保存到参数中
    lr_save_datetime 将当前日期和时间保存到参数中
    lr _advance_param 前进到下一个可用参数
    lr _decrypt 解密已编码的字符串
    lr_eval_string_ext 检索指向包含参数数据的缓冲区的指针
    lr_eval_string_ext_free 释放由 lr_eval_string_ext 分配的指针
    lr_save_searched_string 在缓冲区中搜索字符串实例,并相对于该字符串实例,将该缓冲区的一部分保存到参数中
    lr_debug_message 将调试信息发送到输出窗口
    lr_error_message 将错误消息发送到输出窗口
    lr_get_debug_message 检索当前消息类
    lr_log_message 将消息发送到日志文件
    lr_output_message 将消息发送到输出窗口
    lr_set_debug_message 设置调试消息类
    lr_vuser_status_message 生成带格式的输出,并将其写到 ControllerVuser 状态区域
    lr_message 将消息发送到 Vuser 日志和输出窗口
    lr_load_dll 加载外部 DLL
    lr_peek_events 指明可以暂停 Vuser 脚本执行的位置
    lr_think_time 暂停脚本的执行,以模拟思考时间(实际用户在操作之间暂停以进行思考的时间)
    lr_continue_on_error 指定处理错误的方法

    lr_continue_on_error (0);lr_continue_on_error (1);
    lr_rendezvous 在 Vuser 脚本中设置集合点
    TE_wait_cursor 等待光标出现在终端窗口的指定位置
    TE_wait_silent 等待客户端应用程序在指定秒数内处于静默状态
    TE_wait_sync 等待系统从 X-SYSTEM 或输入禁止模式返回
    TE_wait_text 等待字符串出现在指定位置
    TE_wait_sync_transaction 记录系统在最近的 X SYSTEM 模式下保持的时间

    WEB函数列表:

    web_custom_request 允许您使用 HTTP 支持的任何方法来创建自定义 HTTP 请求
    web_image 在定义的图像上模拟鼠标单击
    web_link 在定义的文本链接上模拟鼠标单击
    web_submit_data 执行“无条件”或“无上下文”的表单
    web_submit_form 模拟表单的提交
    web_url 加载由“URL”属性指定的 URL
    web_set_certificate 使 Vuser 使用在 Internet Explorer 注册表中列出的特定证书
    web_set_certificate_ex 指定证书和密钥文件的位置和格式信息
    web_set_user 指定 Web 服务器的登录字符串和密码,用于 Web 服务器上已验证用户身份的区域
    web_cache_cleanup 清除缓存模拟程序的内容
    web_find 在 HTML 页内搜索指定的文本字符串
    web_global_verification 在所有后面的 HTTP 请求中搜索文本字符串
    web_image_check 验证指定的图像是否存在于 HTML页内
    web_reg_find 在后面的 HTTP 请求中注册对 HTML源或原始缓冲区中文本字符串的搜索
    web_disable_keep_alive 禁用 Keep-Alive HTTP 连接
    web_enable_keep_alive 启用 Keep-Alive HTTP 连接
    web_set_connections_limit 设置 Vuser 在运行脚本时可以同时打开连接的最大数目
    web_concurrent_end 标记并发组的结束
    web_concurrent_start 标记并发组的开始
    web_add_cookie 添加新的 Cookie 或修改现有的 Cookie
    web_cleanup_cookies 删除当前由 Vuser 存储的所有 Cookie
    web_remove_cookie 删除指定的 Cookie
    web_create_html_param 将 HTML 页上的动态信息保存到参数中。(LR 6.5 及更低版本)
    web_create_html_param_ex 基于包含在 HTML 页内的动态信息创建参数(使用嵌入边界)(LR 6.5 及更低版本)。
    web_reg_save_param 基于包含在 HTML 页内的动态信息创建参数(不使用嵌入边界)
    web_set_max_html_param_len 设置已检索的动态 HTML 信息的最大长度
    web_add_filter 设置在下载时包括或排除 URL 的条件
    web_add_auto_filter 设置在下载时包括或排除 URL 的条件
    web_remove_auto_filter 禁用对下载内容的筛选
    web_add_auto_header 向所有后面的 HTTP 请求中添加自定义标头
    web_add_header 向下一个 HTTP 请求中添加自定义标头
    web_cleanup_auto_headers 停止向后面的 HTTP 请求中添加自定义标头
    web_remove_auto_header 停止向后面的 HTTP 请求中添加特定的标头
    web_revert_auto_header 停止向后面的 HTTP 请求中添加特定的标头,但是生成隐性标头
    web_save_header 将请求和响应标头保存到变量中
    web_set_proxy 指定将所有后面的 HTTP 请求定向到指定的代理服务器
    web_set_proxy_bypass 指定 Vuser 直接访问(即不通过指定的代理服务器访问)的服务器列表
    web_set_proxy_bypass_local 指定 Vuser 对于本地 (Intranet) 地址是否应该避开代理服务器
    web_set_secure_proxy 指定将所有后面的 HTTP 请求定向到服务器
    web_set_max_retries 设置操作步骤的最大重试次数
    web_set_timeout 指定 Vuser 等待执行指定任务的最长时间
    web_convert_param 将 HTML 参数转换成 URL 或纯文本
    web_get_int_property 返回有关上一个 HTTP 请求的特定信息
    web_report_data_point 指定数据点并将其添加到测试结果中
    web_set_option 在非 HTML 资源的编码、重定向和下载区域中设置 Web 选项
    web_set_sockets_option 设置套接字的选项


     

  • 从zibeike的blog中学到的几个函数

    2008-09-03 15:47:43

    1、lr_save_string:保存指定的非空字符串到一个参数

    lr_save_string(const char *param_value, const char *param_name);

    2、lr_save_datetime:保存日期和时间到参数中

    3、lr_eval_string

    lr_eval_string("{parameter_name}");返回指定参数的当前字符串值。

     

  • Loadrunner 检查点函数总结(转)

    2008-09-03 14:42:04

     此文转自http://www.51testing.com/?41972

    一、web_find()函数

    该函数的作用是“在页面中查找相应的内容”,常用参数及含义如下:

           web_find("web_find",    //定义该查找函数的名称
    N/Mv$U Zhl F83202
                  "RightOf=a",       //定义查找字符的右边界

                  "LeftOf=b",        //定义查找字符的左边界

                  "What=name",      //定义查找内容

                  LAST);

    使用该函数注意以下事项:

    1、  位置

    该函数在页面内容显示出来以后,在页面中进行查找,所以只能写在要查找内容之后

    2、  录制模式

    该函数只能在基于HTML模式录制的脚本中进行查找

    3、  必须启用内容检查选项

    runtime setting->Preferences里面,把Enable image and text check选中,否则不执行该查找函数

    4、  VBJAVA语法中不支持该函数

    该函数有以下一个缺点:

    1、  执行效率较低

    2、  不返回查找结果情况,如想在执行该函数后根据查找结果做进一步操作时,没有返回值可以依据

    例如:

    在页面中查找“登录成功”的字符串,如果找到该字符串在日志中输出“登录成功”,如果找不到该字符串,则在日志中输出“登录失败”,此时使用该函数没有依据来做此判断,但使用web_reg_find()函数,使用它其中的SaveCount可以进行判断,具体方法我们下面介绍。

     

    二、web_reg_find()函数

    该函数的作用是“在缓存中查找相应的内容”,常用参数及含义如下:

               web_reg_find("Search=Body",   //定义查找范围

                  "SaveCount=ddd",             //定义查找计数变量名称

                  "Text=aaaa",                  //定义查找内容

                  LAST);

    使用该函数注意以下事项:

    1、  位置

    该函数写在要查找内容的请求之前,通常情况下写在如下六个函数之前:

    Web_castom_request();web_image();web_link();web_submit_data();web_submit_form();web_url()

    2、  使用技巧

    在该函数的参数中有个“SaveCount”,该参数可以记录在缓存中查找内容出现的次数,我们可以使用该值,来判断要查找的内容是否被找到,下面举个例子来说明:(引用LR的帮助中的例子)

      // Run the Web Tours sample

           web_url("MercuryWebTours",

                  "URL=http://localhost/MercuryWebTours/",

                  "Resource=0",

                  "RecContentType=text/html",

                  "Referer=",

                  "Snapshot=t1.inf",

                  "Mode=HTML",

                  LAST);

    // Set up check for successful login by looking for "Welcome"

           web_reg_find("Text=Welcome",

                  "SaveCount=Welcome_Count",

                  LAST);

    // Now log in

           web_submit_form("login.pl",

                  "Snapshot=t2.inf",

                  ITEMDATA,

                  "Name=username", "Value=jojo", ENDITEM,

                  "Name=password", "Value=bean", ENDITEM,

                  "Name=login.x", "Value=35", ENDITEM,

                  "Name=login.y", "Value=14", ENDITEM,

                  LAST);

    // Check result

           if (atoi(lr_eval_string("{Welcome_Count}")) > 0){    //判断如果Welcome字符串出现次数大于0

                  lr_output_message("Log on successful.");  }//在日志中输出Log on successful

            else{ //如果出现次数小于等于

                  lr_error_message("Log on failed"); //在日志中输出Log on failed

                  return(0);         }

    我觉得这个方法非常有用,我们可以举一反三,应用到我们实际的项目中

     

    三、插入函数的方法

    1、  手工写入,在需要插入函数的位置手工写入该函数

    2、  光标停留在要插入函数的位置,在INSERT菜单中,选择new step,在列表中选择或查找要插入的函数,根据提示填写必要的参数

    3、  tree view模式下,在树状菜单中选中要插入函数的位置,右键,选择insert afterinsert before,根据提示填写必要的参数

    四、总结

    1、  这两个函数函数类型不同,WEB_FIND是普通函数,WEB_REG_FIND是注册函数

    2、  WEB_FIND使用时必须开启内容检查选项,而WEB_REG_FIND则不没有此限制

    3、  WEB_FIND只能只用在基于HTML模式录制的脚本中,而WEB_REG_FIND没有此限制

    4、  WEB_FIND是在返回的页面中进行内容查找,WEB_REG_FIND是在缓存中进行查找

    5、  WEB_FIND在执行效率上不如WEB_REG_FIND

Open Toolbar