如何用JMeter进行性能测试理论篇实战篇

本文主要介绍在我司完成过的性能测试(性能优化),分为理论篇和实战篇。之前在组内进行过评审,意在将性能测试日常化和规范化,但结合实际情况,其实性能测试做得不多(哪怕有些接口已违背258原则)。

又好长时间没有更文了,分享一下最近遇到的几件比较有意思的事。

三八妇女节的康乃馨

中国水利博物馆的登塔鸟瞰

好吃的牛肉和鸭肉

好啦,接下来开启正文。

理论篇

性能测试目的

可能遇到的问题

  1. 在测试或者系统试点试运行阶段我们的系统一直表现得很好,但产品正式上线后,在用户实际环境下,总是会出现这样那样莫名其妙的问题,例如系统运行一段时间后变慢,导致用户对我们的产品不满意,这些问题是否能避免,提早发现?
  2. 系统刚上线,正处在试运行阶段,能支持多少用户量访问?
  3. 我们的系统已经运行了一段时间,为了保证系统在运行过程中一直能够提供给用户良好的体验,我们该怎么办?
  4. 明年这个系统的用户数将会大幅度增加,到时我们的系统是否还能支持这么多的用户访问?
  5. 未来使用这个系统的人会越来越多,到底能支持多少用户量访问?
  6. 随着存储信息越来越多,数据库查询越来越慢。

能解决的问题

  1. 验证系统稳定性
  2. 新的业务上线,验证新系统能够满足系统的上线指标
  3. 评估系统性能
  4. 验证系统的架构是否存在瓶颈
  5. 对系统的未来容量作出预测和规划
  6. 验证改进性能效果,做对比分析的性能测试,为性能调优提供依据和建议

基本流程

涉及人员

人员角色 角色职责
软件测试工程师 负责整个性能测试的计划及方案的编写、环境搭建、测试用例、脚本编写、测试数据准备、实施测试、测试数据分析、获取测试结果、编写测试报告,保证性能测试工作的顺利完成。
业务系统开发工程师 提供性能测试指标、性能测试影响点、协助性能环境部署,根据性能测试结果跟踪、调优性能或解决程序问题。
产品经理 提供性能测试指标

测试策略

策略 概念 目的 关注点
容量测试 通过负载测试验证反映系统的某种应用特征的极限值,如最大用户并发量、数据库最大记录等。 1.获取系统在拐点时的性能数据;2.获取性能下降点的性能数据。 1.在资源占用以及其他应用方面都设定指标,比如CPU、内存、磁盘等;2.指标设定一般采用80/20原则。
调优测试 系统或应用在建立了 性能基线后,关注性能是否得到提高。通过改变系统的配置,如DB连接池、JVM配置,或应用中处理的并发线程数,改变程序中算法逻辑等。 系统优化是否能够改善性能。 关注系统在应用或配置变化后性能是否能够得到提高。
负载测试 通过模拟系统所承载的并发用户或请求流量的负载,进行不断加压的方式来观察系统在不同压力下的性能变化,如响应时间、数据吞吐量和系统占用资源等,以检查系统的性能和特性,发现系统可能的性能瓶颈,内存泄漏等问题。 1.得出系统的最优的qps以及最优qps时的资源利用率;2.得出系统是否能够满足性能需求;3.得出系统的基线并发数。 关注不同压力下的性能变化以及资源利用率。
压力测试 负载测试的一种,判断被测系统在强压力的情况下,是否会出现不可恢复的崩溃现象,如卡死、异常现象等,也属于破坏性测试的一种。 1.得出系统崩溃点的qps以及资源利用率;2.得出系统基线并发数。 关关注功能测试不能发现的非功能性缺陷。

对应使用场景

适用业务场景 采用测试策略 选用目的 出现频次 举例
性能调优验证 负载&配置 验证性能优化结果,寻求平衡点。 员工花名册-导入
秒杀抢购促销 浪涌&高并发 验证高并发下的处理能力 考拉618大促
寻找性能瓶颈 负载&容量&极限 寻求不同压力下的性能表现、比对
建立性能基线 负载&容量 寻求系统的性能拐点 员工花名册-导入
批处理能力验证 批处理&高并发 针对定时&批处理业务,验证是否满足需求
高可用容灾恢复 高并发&浪涌 验证系统的恢复能力和异常情况下系统存活时间 考拉618大促-联系客服、商品评论等降级(限流3w、商评不展示)
服务上线前验证 并发&负载&容量&稳定性 性能摸底、告警阈值验证 社保系统上线
系统稳定性验证 负载&稳定性 验证系统长期运行的稳定性 亿企代账
短时峰值流量涌入 浪涌&高并发 针对特定的社交媒体论坛类业务的特殊需求 发布会、直播

准入准出

性能测试进入标准

  • 已经产出评审后的性能测试指标,且有开发提供的影响点等;
  • 服务器代码版本稳定,且开发内部测试后无严重阻碍测试进行的问题;
  • 测试环境相关资源已到位,包括软件和硬件资源等;
  • 测试计划编写完成且评审通过;
  • 测试用例完备且评审通过;
  • 功能测试进入冻结期。

性能测试通过标准

  • 一般会从TPS、响应时间、或者跟历史版本/数据对比提升了多少、用户体验等多个纬度界定,使通过标准更科学、更贴近实际业务场景;
    如果业务方给的标准比较笼统,可以参照以下几点:

    • 按测试计划完成所有测试内容。
    • 被测产品满足预期性能指标。
    • 被测产品不存在性能瓶颈等。
  • 如果以上3点未满足,可以继续参照以下几点:
    • 部分计划内容因某些原因未完成,需说明原因,且经过三方确认,一致通过后方可结束。
    • 被测产品不满足预期性能指标,但性能指标在可接受的范围内,且经过三方确认,一致通过后方可结束。
    • 被测产品存在性能瓶颈,但影响较小,暂时没有调优空间,且经过三方确认,一致通过后方可结束。

注意事项

构造测试数据的注意项

  • 先简单场景,再复杂场景,测试业务上可能出现的各种情况。
    • 性能测试如同功能测试,也需要用于覆盖业务可能出现的各种情况的测试用例;
    • 设计用例/场景时,可由简单到复杂,逐步覆盖更多条件;这两种反映了不同级别的性能,都不可少;
    • 简单场景可能是先详细测下某个功能点、或者某个接口、或者某个业务的“单点”性能,有利于小范围内确认性能瓶颈,优化代码;
    • 在简单场景之后,会加入更多条件、或者按照一定的业务流程、复杂情况对组合场景进行测试,测试整个应用、或者整个系统的总体性能。

执行性能测试的注意项

  • 关闭redis、manggo等相关缓存,测试最坏的情况 。

    • 缓存是性能优化的方法之一,对于不频繁变动的数据,为了加快访问速度,提高读的性能,同时减轻数据库压力,可以将数据在缓存中,但是缓存必须在数据被访问后加入缓存之后才会生效,同时,缓存也需要刷新机制,用于更新数据;
    • 为了避免缓存数据失效或者系统刚上线或重启后,缓存还未生效的情况,此时系统访问压力及数据库压力比较大,在性能测试中就需要模拟没有缓存的情况。
  • 脚本本地调通之后需要上传到性能平台执行(JMeter本地调通后脚本上传到性能测试平台执行)。

  • 性能测试平台执行通过率100%(登录接口→业务接口),错误率0.00%;

  • 执行多次,尽量减小偶然性带来的偏差。

    实战篇

    首先了解下性能测试的具体流程

    如何进行性能测试

    明确性能测试的指标

  • 性能测试指标一定要清晰,这个指标是需要开发人员或者产品提供的,不清楚的情况下,一定要找他们讨论并敲定最终结果。

  • 目标清晰了,性能测试就成功一半!不然做完了没有意义,就是白做。

    性能测试评审

  • 结合业务场景,评审性能测试的指标。

  • 评审性能测试的计划或者用例。

性能环境申请

性能环境部署

  • 性能环境的配置
  • 性能环境的数据库
  • 性能环境分配机器
  • 查看服务器日志

脚本编写

登录接口1

登录接口2



登录接口3


import(导入人员-点击导入)




getExcelPreview(导入人员-获取表格)

importEmployee(导入人员-导入表格)

脚本调试

脚本执行

输出性能测试报告

今天的内容到这里就结束啦,吃点水果继续看《大江大河》。强烈推荐《大江大河》、《山海情》、《福贵》,泪目良心制作。