草庐IT

性能测试项目案例

飞天娃娃鱼 2023-05-30 原文

一、项目介绍与部署

1.1微商城功能介绍

轻商城是一个电商项目,需要综合评估各个项目各个接口的功能,给出优化建议;

功能框架

  • 前台:首页、商品页详情、加入购物车、订单、支付、团购、优惠券;
  • 后台:商品管理、会员管理、商城管理

1.2轻商城项目的技术介绍

前端(看得到的部分---HTML、JS技术实现):

  • 微信小程序
  • web页面

后端(看不到的部分---通过后端技术代码实现JAVA):

  • 服务器(应用服务器、数据库服务器、后台业务逻辑代码)

1)轻商城是一个支持web和微信小程序的前后端分离的项目。

  • 前后端分离可以理解为前端系统与后端分离成两个子项目进行开发:
  • 对外表现是:前后端分离项目前端发送请求后响应的内容为json字符串;
  • 如果是前后端不分离的项目,响应的是HTML页面

前后端分离的项目与不分离的项目相比:

运行效率高 :数据传输时只需要传输基本数据即可,不需要传递html格式;

扩展性好:前后端分离是通过数据接口传递,只要借口不改变,前端代码可以添加任何想添加的功能,后端代码也是可以独自加功能,若前后端耦合,加功能需要前后端一起动。

2)前端使用VUE技术框架开发,即支持微信小程序,也支持手机移动端,还支持web页面。

3)后端使用了SpringBoot框架进行开发,MySql做数据库。

4)目前还在开发完善阶段

1.3微商城项目的技术构架

技术构架图:

1.4熟悉数据库设计

在性能测试前需要对要测试的部分业务功能涉及到的数据库表有一定了解;

1)熟悉数据库设计结构,便于后期对数据库的性能监控;

2)性能测试过程中,数据库容易出现瓶颈;

1.5 微商城项目的部署过程

准备工作:

安装JDK

安装MySQL

安装Nginx

安装node.js

项目搭建步骤:

项目部署过程: 

二、性能测试需求分析

  • 功能测试:关注需求规格中的业务功能(正向、逆向)
  • 性能测试:关注系统对特定业务需求场景的满足程度(时间、资源)
    • 关注维度:业务功能、项目代码、服务器、硬件配置

2.1性能需求获取

1)客户提出(客户可以是甲方,也可以是产品)

  • 能够明确提出需求的一般都是金融、银行、电信、医疗相关的行业软件
  • 即使是客户提出的需求,需要做初步评估需求的合理性

2)根据历史数据分析(根据软件在运行过程中的运营数据来计算出应该达成的性能指标)

  • 日活 —— 初步评估稳定性负载
  • 峰值 —— 初步评估压力负载

2.2新能测试点提取

性能测试点提取规则:

轻商城性能测试点提取:

  • 1)根据性能测试点的提取规则,结合轻商城项目的功能,整理出要进行性能测试的测试点;
  • 2)通过使用前面讲解的获取性能指标的方法(产品给/运营数据计算),得到每个测试点要满足的性能指标
  • 3)确定性能测试目标:
    • 针对每个核心的业务功能都要求达到对应的性能指标要求
    • 基于业务流程(多个接口组合)来测试是否达到性能指标要求
    • 模拟用户真实业务场景,进行长时间的稳定性测试

2.3性能测试计划(这部分与上面有重合之处,前面是思考点,最后都要落实在测试计划文档中)

1)测试背景

轻商城是公司新开发的一个电商项目,为了保证项目上线后能够稳定运行,且在后期推广中能够承受用户增长,需要对项目进行性能测试;

2)测试目的

  • 确定核心业务功能的TPS
  • 对业务流程(多接口组合)进行压测
  • 系统能在实际系统运行压力的情况下,稳定运行24小时
编号功能模块业务功能TPS响应时间
T01登录登录203s
T02首页进入首页1005s
T03商品搜索商品403s
T04商品查看商品详情1003s
T05购物车添加购物车203s
T06购物车查看购物车203s
T07订单商品结算103s
T08订单提交订单103s
T09订单查看我的订单402s

3)测试范围

编号功能模块业务功能功能描述优先级
T01登录登录用户通过用户名和密码登录
T02首页进入首页获取商城首页数据
T03商品搜索商品通过关键字搜索商品
T04商品查看商品详情点击商品进入详情页
T05购物车添加购物车将商品加入购物车
T06购物车查看购物车用户查看购物车内商品
T07订单商品结算对已选择的商品进行结算
T08订单提交订单用户提交商品订单
T09订单查看我的订单用户查看商品列表

4)测试策略:

  • 基准测试-----先做基准测试,确定估算标准
  • 负载测试-----通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足系统的性能指标情况下,系统所能承受的最大负载测试;
    • 分别模拟5、10、30、50、100个用户对系统进行负载测试,查看不同并发时,系统软件各项指标是否符合要需求;
  • 稳定性测试  -----用200个用户对系统进行7*24小时的不间断稳定性测试,查看服务器日志内有无异常和报错:系统软件各项指标中有无异常波动,是否存在内存溢出的问题;
    • 验证系统长期运行的稳定性以及是否存在内存溢出之类的问题。       

5)风险控制: 

风险类型风险描述风险级别应对方案
环境风险部署出现问题,联调进度缓慢更换环境,增加资源配置
数据风险构造测试数据时间较长        开发人员协调
交付风险发现比较严重的bug延长测试时间,增加对应人员

6)交付清单:对应进度安排中每个阶段的产物;

性能测试计划、测试脚本、性能缺陷统计和性能测试报告等;

7)进度与分工:性能测试工作分为几个步骤以及每个步骤的开始、结束时间和对应的负责人

阶段事项开始时间结束状态状态责任人
需求阶段需求评审完成多方参与
系统架构图完成开发
需求调研完成性能测试人员
准备阶段环境支付完成运维、开发
应用部署完成运维、开发
数据准备完成开发、DBA、测试
脚本开发完成性能测试人员
实施阶段执行压测未完成性能测试人员
服务监控未完成运维、测试
数据收集未完成性能测试人员
结束报告评审未完成多方评审

2.4性能测试用例编写

参考以下性能测试用例的模板来编写:

  •  对于单个业务功能的性能测试,每个测试点编写一个测试用例(多个接口有强关联——依照接口而言,可以将多个接口放入同一个用例)
  • 对于多个业务功能的组合测试,按照用户实际的业务场景,挑选出有代表性的业务流程编写测试用例。

三、性能测试脚本开发

使用JMeter编写测试脚本并调试;

3.1 常用的测试元件

常用的测试元件

取样器---HTTP请求发送HTTP请求
配置元件---HTTP请求默认值设置HTTP请求的默认参数
配置元件---用户定义的变量定义变量,供后面引用
后置处理器---JSON提取器提取JSON响应结果中的内容
断言---响应断言对响应结果进行断言
断言---JSON断言
监听器---查看结果树用于JMeter脚本调试时查看运行日志
监听器---聚合报告用于JMeter性能测试时查看运行结果

初始化工作:

1)创建测试用例结构

注意:一个线程组就是一个用例,与其中有多少个请求无关;

2)设置HTTP请求默认值

3)用户定义的变量

4)添加监听器---查看结果树

5)添加监听器---聚合报告

3.2 编写脚本

3.2.1 登录脚本

 断言:状态码、errmsg

如果做接口测试,必须断言响应中的业务数据,可以加上状态码和描述信息

如果做性能测试,可以只添加状态码和描述信息断言

3.2.2 获取首页数据

3.2.3 搜索商品 

如果url中的参数有中文,建议将参数写到下面列表中 

断言:状态码、errmsg

如果是接口测试脚本,必须针对响应中的商品数量进行断言。 

 3.2.4 查看商品详情

 断言:状态码、errmsg

如果是接口测试脚本,必须针对响应中的商品详细信息进行断言;

3.2.5 加入购物车

用例名称添加购物车
用例编号Index005
用例描述TPS达到20的情况下,加入购物车的时间不超过3s
前置条件首页相关的商品数据已经配置完成
用例步骤动作期望的性能
1填写用户名密码进行登录<=3s
2选择商品加入购物车<=3s

添加请求1--登录

添加json提取器:

提取token后,完善在信息头管理器中

添加请求2--加入购物车

添加断言:状态码、errmsg

如果是接口测试脚本,需要再查询我的购物车,检查我的购物车返回的数据是否与加入购物车返回的数据一致,也就是需要再添加一个请求;

3.2.6 查看购物车

用例名称查看购物车
用例编号Index006
用例描述TPS达到20的情况下,查看购物车的时间不超过3s
前置条件首页相关的商品数据已经配置完成
用例步骤动作期望的性能
1填写用户名密码进行登录<=3s
2进入购物车进行查看<=3s

请求:先发送登录请求,提取token信息,添加查看购物车,将token信息赋值为X-litemall-Token头域,填写请求路径和参数;

 3.2.7 提交订单

用例名称结算并下订单
用例编号Index007
用例描述TPS达到10的情况下,结算下订单的时间不超过3s
前置条件首页相关的商品数据已经配置完成
用例步骤动作期望的性能
1填写用户名密码进行登录<=3s
2选择购物车中的商品进行结算<=3s
3下订单<=3s

 提交订单:1)先发送请求登录,提取token信息;2)添加结算请求,将token信息赋值为X-litemall-token头域,填写路径请求和参数;3)添加订单请求,将token信息赋值为X-litemall-token头域,填写路径请求和参数(注意地址与ID必须与用户ID匹配)

响应:

状态码;errmsg

如果脚本为接口测试脚本,需要断言响应报文中的订单数据,与数据库中订单表中我的订单数一致;

3.2.8 查看订单

在编写脚本的过程中,常用的静态数据可以写到用户定义的变量中,在脚本运行中引用,好处是后续如果不修改数据,可以直接修改变量,不需要去每个脚本中进行修改; 

3.2.9 业务流程的脚本

用例名称业务流程1
用例编号Index009
用例描述在业务流程过程中,响应时间和TPS达到要求
前置条件首页相关的商品数据已经配置完成
用例步骤动作期望的性能
1填写用户名密码进行登录<=3s
2进入首页<=5s
3查看商品详情<=3s
4加入购物车<=3s
5选择购物车中的商品进行结算<=3s
6下订单<=3s

看起来用例复杂,但是写脚本简单,因为单接口脚本都已经写好,直接组合即可;

 

有关性能测试项目案例的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  7. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  10. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

随机推荐