草庐IT

性能测试流程-性能测试2

Yasar.l 2023-06-05 原文

性能测试流程

1. 性能测试需求分析
2. 性能测试计划及方案
3. 性能测试用例
4. 搭建测试环境
5. 测试数据准备
6. 测试脚本编写
7. 执行测试脚本
8. 性能测试监控
9. 性能分析和调优
10. 性能测试回归
11. 性能测试报告总结

1、性能测试需求分析

熟悉被测系统

        熟悉系统的业务功能以及数据流向
        熟悉系统的技术架构

明确性能测试范围

        从业务角度,挑选核心业务进行测试以及生产环境访问量多的业务
        从技术角度,挑选逻辑复杂度高、数据量大的业务进行测试

明确配置信息

        明确性能测试环境的CPU、内存、网络、磁盘、实例等配置详情,以及与生产环境的资源配置的差异性;

确定测试策略

基准测试
单交易负载测试
混合场景测试
高可用性测试
异常场景测试
稳定性测试
其他特殊场景

确定性能测试指标

        有需求:按照需求来测试                     
                例如:
                        新建线索业务并发20个用户
                        平均响应时间要小于等于3s
                        事务成功率为100%
                        CPU、内存使用率小于等于80%
        没有需求:同类型软件对比,对未来数据进行预估;如果公司有运营数据统计,可以根据运营数据对性能测试的指标进行估算;

明确上线时间

        需要明确上线的时间,编写性能测试方案,合理安排性能测试的人员与执行计划,确保能按时上线;

2.性能测试计划及方案

每个公司都有自己的模板,大体上的性能测试方案的内容上出入不到,包含以下内容;

1 、项目背景 —— 主要介绍下项目的背景
2、测试目的 —— 验证被测系统在高并发下的处理能力、响应能力,稳定性等,能否满足预期。
3 、测试范围 —— 对于需求分析中的性能测试内容
4 、测试策略 —— 对应于需求分析中的测试策略
5 、风险控制 —— 技术风险、人力风险
6 、环境信息  ——压测的环境与生产环境的资源情况
7 、进度和分工 —— 谁在什么时候做什么事

3. 性能测试用例

4. 搭建测试环境

  • 测试机器硬件配置尽量和线上一致
  • 系统版本与线上一致
  • 测试环境部署线上最小单元模块
  • 应用、中间件、数据库配置要与线上一致
  • 其他特殊配置

测试环境的搭建,需要了解首先了解项目的架构,是使用LNMP,还是JAVA、C#等,不同的架构方式的部署,后面有时间出一些文章进行项目部署的内容;

通常,我们在搭建集成测试环境之时,会使用Jenkins与docker搭建流水线,开发只需要在gitlab上发起合并请求给测试,测试合并之后,jenkins就会就行编译、打包、部署;

5. 测试数据准备

方式(造数的详细方法,后面会出教程)

1、通过使用Jmeter,调用实际业务接口进行造数;

例如:我们可以模拟实际用户操作页面的操作,调用相应的接口;

2、通过使用Jmeter,进行对表进行增删改查操作,达到造数;

3、使用存储过程造数

使用存储过程造数,一般都是适合表数据量比较少,简单,优点就是快;

4、使用脚本造数,可以使用python/java等语言,编写造数脚本;

python,封装mysql

import pymysql


class MysqlUtil:
    # 初始化
    __conn = None
    __cursor = None

    # 创建连接
    @classmethod
    def __get_conn(cls):
        if cls.__conn is None:
            cls.__conn = pymysql.connect(host="数据库",
                                         port=端口,
                                         user="用户名",
                                         password="密码",
                                         database="数据库")
        return cls.__conn

    # 获取游标
    @classmethod
    def __get_cursor(cls):
        if cls.__cursor is None:
            cls.__cursor = cls.__get_conn().cursor()
        return cls.__cursor

    # 执行sql
    @classmethod
    def exe_sql(cls, sql):
        try:
            # 获取游标对象
            cursor = cls.__get_cursor()
            # 调用游标对象的execute方法,执行sql
            cursor.execute(sql)
            #  如果是查询
            if sql.split()[0].lower() == "select":
                # 返回所有数据
                return cursor.fetchall()
            #  否则:
            else:
                # 提交事务
                cls.__conn.commit()
                # 返回受影响的行数
                return cursor.rowcount
        except Exception as e:
            # 事务回滚
            cls.__conn.rollback()
            # 打印异常信息
            print(e)
        finally:
            # 关闭游标
            cls.__close_cursor()
            # 关闭连接
            cls.__close_conn()

    # 关闭游标
    @classmethod
    def __close_cursor(cls):
        if cls.__cursor:
            cls.__cursor.close()
            cls.__cursor = None

    # 关闭连接
    @classmethod
    def __close_conn(cls):
        if cls.__conn:
            cls.__conn.close()
            cls.__conn = None

封装后,只需要引用上封装好的包,编辑SQL即可; 

from tools.mysql_util import MysqlUtil

a=MysqlUtil.exe_sql("select * from tb_board")
print(a)

 

 6. 测试脚本编写

选择工具(Loadrunner、Jmeter、Locust等)
选择协议(Http、TCP、RPC)
参数化
关联
检查点
事务判断

7. 执行测试脚本

说明:先保证脚本调试通过之后,才能进入正式压测阶段
执行测试脚本时,要先进行性能运行场景的设置,再运行脚本

8.性能测试监控

性能监控就是监控服务器的各项性能指标。例如:监控CPU、内存、网络、TPS、磁盘IO

9. 性能分析和调优

说明:性能测试分析人员经过对结果的分析以后,有可能提出系统存在性能瓶颈。
提示:
  调优人员 ( 开发人员、数据库管理员、系统管理员、网络管理员、性能测试分析人员 ) 相关人员对系统进行调整;

10. 性能测试回归 

验证 - 性能测试人员继续进行回归 测试,与以前的测试结果进行对比,从而确定经过调整以后系统的性能是否有提升,资源使用情况是否正常;
注意 :
系统调优由易到难的先后顺序如下:
1. 硬件问题
2. 网络问题
3. 应用服务器、数据库等配置问题
4. 源代码、数据库脚本问题
5. 系统构架问题

11.性能测试报告总结

  • 概述
  • 测试环境
  • 结果与分析
  • 调优说明
  • 项目时间表
  • 结论
  • 建议

有关性能测试流程-性能测试2的更多相关文章

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

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

  2. 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(在整个项目的根目录中),然后当

  3. 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?并散列所有无济于事。

  4. 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

  5. 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/

  6. 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

  7. 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

  8. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  9. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  10. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

随机推荐