软件测试


网站首页 | 软件测试论坛 | 软件测试培训 | 软件测试博客 | 软件测试杂志 | 软件测试沙龙 | 软件测试下载 | 软件测试顾问
业界新闻 | 软件测试人才 | 软件测试技术 | 软件测试工具 | 行业软件测试 | 软件测试管理 | 软件质量专栏 | 软件开发专栏
当前位置:首页>>软件测试技术>>性能测试>>正文
X银行营销服务系统性能测试小记续
文章出处:51testing论坛 作者:xingcyx 发布时间:2007-01-19
    9、 经验在本次性能测试的过程中,我们遇到一些问题,通过解决这些问题,从中获得了一些经验。
    现总结如下: 问题一在我们对系统进行测试的过程中,某些操作是相关联的。例如我们测试“查看客户资产历史”这个交易的系统响应时间,这时需要先列出客户的基本信息,选中一个客户,点击打开另一个页面,才能查看到该客户的资产历史信息,同时,在测试脚本中需要对所选择的客户编号做一个参数化,但由于LoadRunner不提供像WinRunner或QTP一样识别页面对象的功能,如果在Vugen中直接抓取页面上显示的客户编号去参数化,实现起来将十分烦琐。考虑到在以上那两步操作中,第一步“列出客户基本信息”只是辅助的操作,而第二步操作“查看客户资产历史”才是我们要测试的功能点,因此我们忽略了这二者之间的关联性,仅对第二步操作中的客户编号进行参数化。(只要服务器端对此不加验证,甚至我们将第一步操作都忽略掉,也是可行的)。结论:LoadRunner的工作原理是根据所选择的协议组装成相应的报文在前后台之间通讯,以此达到模拟实际操作的目的,因此我们只需将要测试的交易或功能点所需要组装的报文传送给后台服务器即可(因为我们关注的只是系统的性能,不是功能),而不必像功能测试那样,按部就班地重现每一步操作。
    问题二在测试过程中,我们发现有一个查询交易的系统响应速度特别慢,无论是在Controller中使用单个虚拟用户执行脚本,还是在Vuser中直接运行,情况均是如此,然而当我们用手工进行同样操作的时候,响应时间却明显地小于工具统计出来的时间,也就是说,在LoadRunner中模拟操作的结果与真实操作的结果明显不一致。经过反复尝试与观察,我们才终于找到问题的原因所在:该查询交易是通过客户的证件号码查询客户信息,当用户输入客户的证件号码时,如果没有选择证件类型,系统会自动将证件类型设置为默认值“身份证”。按“证件类型+证件号码”为组合索引查询客户信息表,查询速度极快,而在我们录制脚本时,忽视了“证件类型”这项输入,只有“证件号码”,因此查询的效率大为降低。解决办法:只需在测试脚本中,对CertType(“证件类型”)一项赋值为“A”(“身份证”),此时在LoadRunner中重新运行该脚本,响应速度提高,统计结果与实际完全一致!结论:LoadRunner的工作原理是根据所选择的协议组装成相应的报文在前后台之间通讯,以此达到模拟实际操作的目的,因此我们在测试脚本中组装发送到服务器端的报文时,注意一定要和实际操作时的发送报文完全一致,这样才能保证测试的结果与真实情况相吻合。这就要求在测试正式开始执行时,要对测试脚本进行反复的调试,通常的做法是:在Vugen中执行一遍脚本,统计执行某个事务的时间,再用手工实际做一遍同样的操作,大体上比较一下,确保与实际估算的时间没有太大出入后,再逐渐增加并发用户数,正式开始性能测试。
    问题三在我们的每个测试脚本中的init部分,都录制了登录系统的操作,并且对登录的用户名进行了参数化,使用各种不同身份的用户(分行主管、支行主管、客户经理等)进行相同的操作。在并发测试过程中发现对某些查询交易测试的结果波动较大,系统响应时间从零点几秒到几十秒不等。经检查后发现原因在于:使用不同身份的用户登录系统后,在输入查询条件后,点击查询按钮后会将根据该用户的身份,将其所属的分行机构号、支行机构号、客户经理编号等一并提交,因此在脚本中,就必须根据不同的用户身份,分别将其对应的分支行机构号等也运用参数提交,否则在执行脚本时就会出现查询不到记录或查询速度变慢等各种问题。解决方法有三个:1、修改脚本,使其能够依据用户的身份分别传送相应参数,2、针对不同类型的用户使用不同的脚本分别测试。3、输入参数使用统一的用户类型。在实际中,我们为了简化脚本的复杂度,节省对脚本编程的时间,采取的是第三种方法。结论:由于LoadRunner的工作原理是根据所选择的协议组装成相应的报文在前后台之间通讯,因此它会跳过在应用程序前台进行的校验,所以在脚本回放的时候一定要注意在脚本中提前进行这些校验或改由人工控制,以保证发送报文的正确性(如操作权限的控制等)。
    问题四测试多用户并发登录系统的时候,从虚拟用户图和事务图上发现,总有一部分用户在登录的时候要等待很长时间,用户登录的最小时间与最大时间相差非常大。于是我们在让脚本自动运行的同时,手工再登录一个用户,发现无论如何都不会发生等待的情况,多次试验的结果均是如此,也就是说LoadRunner测试的结果与实际结果再次发生了偏差!经过反复的调试,以及与程序开发人员沟通,我们终于发现问题的原因所在:在用户登录系统的时候,系统会自动记录登录用户的信息,并产生一个登录ID,以此ID做为主键,向数据库插入记录。因此当大量用户在极短的时间内同时登录时,就有可能出现生成相同的登录ID的情况,此时便会造成数据库中的主键冲突,导致用户等待很长时间或登录失败。而我们手工测试时却无法做到在很短的时间内同时登录,因此很难用手工重现此种情况。通过LoadRunner的模拟表现出来的状况,正是我们测试出程序存在的性能问题,并非与实际结果的偏差。还有一个例子,在第二轮性能测试中,同样发生了类似的情况。在本系统中,如果同一个用户登录后,未正常退出超过5次,系统将会把该用户锁住,使其无法再次登录,而我们用于参数化的用户名个数有限,因此当脚本使用大量用户同时登录时,很容易造成同样的用户登录系统而未签退的情况发生(脚本正在执行,还未能退出),此时将会造成许多用户操作的失败。结论:使用LoadRunner可以模拟出大量用户同时对系统操作的情况,而这些情况通过手工往往是很难重现出来的。例如大量用户在同时对系统做某些操作时,很容易造成数据库的死锁、锁等待、主键冲突、数据混乱等等问题,因此在做性能测试的同时,也常常可以连带测试出系统的一些隐蔽的“缺陷”。在本次性能测试中,这种例子是很多的。对待此类“缺陷”,应具体情况具体分析。有些确实是程序的BUG,需要修正,而有些可能只是很极端的情况,只有在做压力测试时才有可能发生,可不必深究。
    问题五此问题发生在第二轮测试(即回归测试)中。在第一轮测试中发现的性能问题,经程序员修正后,我们对系统进行了第二轮性能测试,以验证其性能改进的效果。在前一轮测试中,我们发现通过选择客户级别为“未评级”时,查询的速度极慢,经过改进后,速度应有较大提高。然而在回归测试中,却依然很慢。经过对测试脚本和程序的仔细检查,才发现原来在程序中已将“未评级”这个选项去除,而我们的测试脚本的参数文件中仍然保留有该选项,因此测试的结果与前次没有区别。在参数文件中将该选项去掉后,测试结果正常,查询效率有所提高。
    结论:使用录制好的测试脚本进行回归测试之前,一定要先仔细检查、了解程序的改动,对原先的测试脚本做必要的修改后,才可以重新测试,否则只是在做无用功。
    10、 教训在本次测试过程中,由于经验不足,我们也得到了一些教训。前事不忘,后事之师,现总结出来与大家分享。
    与客户的沟通做得不够,客户要求我们做的性能测试用例数量太多,我们未能据理力争,最后导致工作量过大。
    按照原定的项目计划,我们要在系统的功能测试即将结束前进驻项目组,准备并进行性能测试。然而由于客户在功能测试的后期仍然不断的提出新需求,导致开发人员疲于奔命,系统的性能难以稳定下来,性能测试的前期准备工作也受到很大影响,不能正常开展,浪费了很多人力物力。
    由于客户无法提供一个单独的性能测试环境,我们的性能测试工作与业务组的功能测试在同一个环境下进行,而系统的功能测试迟迟未能完成,加上ETL(数据转换)小组对数据库资源的占用,因此我们的性能测试只能在夜间才能进行。导致时间上的浪费,使项目的成本增加。
    没有将性能测试中发现的缺陷记录到缺陷管理工具中加以跟踪,而仅仅体现在最后的测试报告上,个人认为这是比较不规范的做法。
    性能测试前的数据准备不够充分。客户提供测试的系统用户、身份数量有限,导致许多案例的测试只能使用少量数据进行参数化,由此带来许多本可以避免的问题。
    测试计划及测试报告的书写格式缺乏规范,尤其测试计划书未能包含本应包含的所有内容。
    在我们将LoadRunner的测试结果文件全部提交给客户的前提下,客户仍然要求我们在测试报告中将每一次测试的数据均以表格的形式填至测试报告中,此项工作的工作量十分巨大,个人认为这样做并无必要。以上是在本次性能测试及回归测试过程中总结出来的一些经验教训,在此做一个小小的总结,以便下次工作中改进。


此文来源于51testing论坛,转载请注明为51testing论坛
原始链接:
http://bbs.51testing.com/thread-16702-1-1.html

站内搜索
相关文章
◎X银行营销服务系统性能测试小记
◎性能测试VS负载测试VS压力测试
◎Web服务器日志分析工具点评
◎压力测试和性能测试的区别
◎性能测试(并发负载压力)测试分析-简要篇
◎Oracle Pro*C/C++游标和存储过程性能测试报告
◎如何测一个门户网站是否支持10万用户同时在线-转自51testing上的讨论
◎性能测试之场景设计思想
◎软件性能测试中常注意的事项
◎常用性能计数器说明
◎性能测试常见误区
◎LoadRunner的Apache的监控
◎什么是可伸缩性测试
◎如何调整压力测试工具
◎Oracle SQL 性能优化技巧
◎优化ERP应用
◎性能测试的容量评估
◎跟踪数据库性能变化
◎性能测试的准备
◎测试您的DB2数据库:用JMeter测量性能
◎Java性能
◎刨根问底 微软Vista操作系统详尽测试
◎WTC性能测试报告
◎怎样提高性能测试的效率和质量
◎关注10大E-mail邮箱性能
◎性能比较:事务处理控件
◎性能测试之协议分析
◎性能和容量规划(3)
◎性能和容量规划(2)
◎性能和容量规划(1)
◎性能测试基础知识-处理器调度程序性能
◎实际项目中可使用的性能需求
◎AIX 性能调优-内存、CPU篇
◎性能测试基础知识-性能的规划与实现
◎如何进行系统的容量规划管理
◎WebLogic Server 性能调优(三)
◎WebLogic Server 性能调优(二)
◎WebLogic Server 性能调优(一)
◎文件系统性能调优
◎系统性能测试方案
◎性能计数器解释
◎Windows DNA应用程序数据访问组件的强度测试
◎cdma2000 1xEVDO网络性能测试
◎对你的ASP程序作负载测试
◎一个大型集中项目的性能测试实例
◎迈向测试自动化成功的七个步骤
◎测试自动化组织模型
◎测试自动化服务的定位
◎选择测试自动化框架
◎带宽大小我心知 专业带宽评测工具
热门文章
◎性能测试方法
◎压力测试计划实例
◎系统性能测试方案
◎性能测试指标介绍
◎带宽大小我心知 专业带宽评测工具
◎Oracle SQL 性能优化技巧
◎性能测试的准备
◎一个大型集中项目的性能测试实例
◎关注性能:压力负载
◎性能测试基础知识-性能的规划与实现
◎性能:软件测试的重中之重
◎性能测试及性能调整概述
◎怎样提高性能测试的效率和质量
◎AIX 性能调优-内存、CPU篇
◎性能测试
◎性能计数器解释
◎WebLogic Server 性能调优(一)
◎如何调整压力测试工具
◎性能测试(并发负载压力)测试分析-简要篇
◎性能测试之协议分析
◎性能测试的容量评估
◎性能测试基础知识-处理器调度程序性能
◎性能和容量规划(1)
◎性能测试常见误区
◎LoadRunner的Apache的监控
◎Java性能
◎有效的用例编写规则
◎WebLogic Server 性能调优(三)
◎什么是可伸缩性测试
◎实际项目中可使用的性能需求
◎跟踪数据库性能变化
◎软件性能测试中常注意的事项
◎WTC性能测试报告
◎测试您的DB2数据库:用JMeter测量性能
◎如何测一个门户网站是否支持10万用户同时在线-转自51testing上的讨论
◎调整压力测试工具
◎关注10大E-mail邮箱性能
◎性能测试之场景设计思想
◎对 Linux 内核进行压力测试
◎WebLogic Server 性能调优(二)
◎刨根问底 微软Vista操作系统详尽测试
◎路由器性能指标详解
◎对你的ASP程序作负载测试
◎NET Framework部署的性能调整
◎压力测试和性能测试的区别
◎文件系统性能调优
◎Ad Hoc网络性能测试关键技术研究
◎性能和容量规划(2)
◎Java性能
◎性能和容量规划(3)

Google提供的广告