当前位置:首页 » 《关注互联网》 » 正文

Jmeter接口测试实战分享,你一定要知道的问题总结!_生而为人,我很抱歉!你不努力,终将淘汰

11 人参与  2022年01月18日 09:27  分类 : 《关注互联网》  评论

点击全文阅读


在这里插入图片描述
Jmeter是一款性能测试工具,因轻量级、开源、社区接受度高、容易入门等优点,也被测试人员广泛用于做接口测试。在使用Jmeter做较大规模、复杂场景的接口测试时,往往会遇到一些困难。阅读本文你将了解:

  • 在工作时间紧张情况下,如何做好自动化测试?
  • 如何设计一套完整的、结构优化的jmeter接口自动化测试方案?
  • 如何设计复杂的Jmeter接口测试用例?
  • 如何提升编写Jmeter自动化脚本的能力?

项目背景

被测系统是泰康云TDS平台,该平台整合敏捷开发与DevOps研发管理工具,提供产品规划、项目管理、代码托管、代码检查、持续集成和持续发布、制品管理等能力,简化研发协作过程,帮助研发团队完成软件生命周期管理。本篇内容以TDS平台测试为背景,介绍测试人员如何设计接口自动化测试。

遇到的问题

本文从我们工作中常遇到的问题入手,展开问题,详细解答。
问题一:被测项目迭代频繁,测试用例设计、维护、执行已经占用了测试工程师大部分工作时间,没有时间搞自动化怎么办?

问题二:为什么选jmeter做接口自动化测试?

问题三:多人协同测试情况下,自动化脚本结构如何设计?

问题四:单接口测试用例设计、执行、断言比较简单,但是涉及多接口、异步等复杂场景该如何设计用例?

问题五:接口测试用例如何断言?只断言被测接口返回值就可以了吗?

问题六:Jmeter与流水线集成,除了jmeter+ant+jenkins,还有更优的方案吗?

问题七:如何度量接口自动化结果?接口用例成功率达到100%就够了吗?

问题八:测试脚本执行过程中遇到的稳定性、执行效率等问题如何解决?

实践分享

问题一:没有时间搞自动化测试?

下面将从敏捷项目迭代特点和自动化测试时间规划这两个方面,介绍我们是如何确认自动化测试目标、安排自动化测试时间的。

1>分析敏捷项目迭代特点,确认自动化测试目标

下图展示了在敏捷开发模式中,随着项目迭代进行,新功能特性与已有功能特性的数量变化。每个迭代新特性的测试工作量变化不大,但是已有特性的回归测试任务量却是累计增加的。
在这里插入图片描述
因此我们自动化接口测试的目标是针对已有特性做自动化回归测试,提升回归测试效率。而对当前迭代的新特性以手工测试为主,自动化测试为辅。

  • 针对当前迭代新特性,手工测试为主,自动化测试为辅。原因分析:

    当前迭代中的新功能是逐渐成长起来的。功能可能不稳定,需要修改优化,对新功能立即开发自动化测试脚本投入成本大;

    当前迭代中的新功能,借助沟通,通过手动形式直接验证更有效;

    每天发好几个版本,增加什么就测试什么,手工测试灵活性高。

  • 针对上一个迭代已有特性,采用自动化回归测试。原因分析:

    上一个迭代已有功能相对稳定,自动化脚本开发和调试都没有障碍,脚本开发效率更高;

    自动化测试发现缺陷的能力比手动测试弱,用于回归测试更符合自动化测试的特点。

2>为自动化测试腾出时间

方法:

  • 在迭代初期,通过思维导图梳理测试点,而不一定要写详尽的测试用例,从而节省时间编写上一个迭代特性的自动化测试脚本和脚本维护;
  • 在迭代测试过程中,利用探索式测试风格,持续开展测试学习、设计、执行、结果分析,提高测试效率,积累测试经验,节省测试时间。

问题二:为什么要用Jmeter做自动化接口测试?

用Jmeter做接口测试工具有以下优势:

  • 支持测试脚本录制,badboy、blazemeter等;
  • 支持多平台部署,易于与流水线集成;
  • 开源免费,提供丰富组件及第三方插件库;
  • 支持多线程组并行,提高接口测试效率;
  • 一学多用,接口测试->性能测试。

问题三:多人协同测试,自动化脚本结构如何设计?

Jmeter元件组合是非常灵活的,为了提升用例维护效率、方便多人协作,我们参考相关资料及项目实践经验,总结了如下图脚本结构:
在这里插入图片描述
以下为主要脚本结构及对应Jmeter元件说明:

测试计划:项目根节点

jmeter相关元件说明:

TestPlan:控制测试用例执行方式:并行/串行

全局参数配置:

jmeter相关元件说明:

User Defined Variables:存放测试环境(dev/test)配置信息

JDBC Connection Configuration:存放数据库连接配置

HTTP Request Defaults:配置http接口默认参数,全局生效,eg:请求timeout=10000ms

当前脚本通用模块库:存放所有测试相关采样器,由用例模块通过模块控制器调用

包含健康检查相关、webShell相关、数据准备模块、变量初始化模块、数据断言模块、登录模块、团队管理模块、流水线模块、制品管理模块等业务模块

jmeter相关元件:

Transaction Controller

HTTP Request Sampler

JDBC Request Sampler

WebSocket request-response Sampler

WebSocket Open Connection Sampler

Response Assertion

JSON Assertion

BeanShell Assertion

历史组件/模块设计参考

接口测试模板

用例模块:存放接口测试用例,通过模块控制器调用当前脚本通用模块库

包含:项目管理、部署组管理、svn管理、团队管理、流水线管理、代码库管理、制品管理等相关测试用例集合

jmeter相关元件

Test Fragment:作为用例分割符

Thread Group:用例组,存放一组相关测试用例

Transaction Controller:事务控制器

Module Controller:调用当前脚本通用模块库

User Defined Variables:存放用例相关测试数据

BeanShell Sampler:实现用例编号自增,参数传递等

测试结果展示

View Results Tree

Summary Report

问题四:复杂场景如何设计用例?

复杂场景用例设计之前,先分享下从功能角度出发,我们是如何设计用例的。如下图所示:
在这里插入图片描述
除此之外,结合项目实际情况,还需要考虑其他非功能场景:

  • 异常测试,eg:幂等(重复提交、超时重试)、接口事务、分布式场景、环境异常、大数据量等;
  • 性能测试,eg:响应时间、吞吐量、资源利用率等;
  • 安全测试,eg:敏感信息是否加密、接口权限控制、sql注入等。

下面以实际项目中的两个场景为例,来分享我们是如何应对复杂测试场景的。

1、多接口实例:流水线执行场景测试,涉及6个接口

方法:

步骤1、分析相关接口调用顺序、阶段。

前置准备

新建项目接口、项目关联代码库接口、新建部署组接口

用例执行

新建流水线接口、流水线执行接口

后置处理

项目删除接口

步骤2、测试数据梳理:

需要在运行前初始化的数据,包含:

环境配置信息,eg:ip、端口、数据库配置等

测试场景共享数据,eg:代码库信息

单接口测试数据

运行时动态生成的数据,包含:

某个接口的返回数据,其他接口需要使用,eg:项目id、部署组id、流水线id等

需要调用相关函数或工具动态生成的数据,eg:uuid、时间戳等

步骤3、梳理测试用例,编写相关脚本,脚本图示如下:
在这里插入图片描述

2、异步实例:流水线配置定时任务后,验证定时任务是否按照配置时间成功触发

难点分析:流水线配置定时任务不会立即执行,定时任务触发需要等待websocket推送消息
方法:

步骤1:新建流水线配置定时任务执行时间为当前时间+1min

使用beanshell采样器实现

Calendar calendar = Calendar.getInstance();//获取当前时间
calendar.set(Calendar.MINUTE,calendar.get(Calendar.MINUTE)+1);

步骤2:通过WebSocket request-response Sampler监听定时任务推送的消息,完成断言。脚本图示如下:

在这里插入图片描述

问题五:接口测试用例如何断言?

对于接口的正确性验证,只验证被测接口返回body很明显是不够的,这里总结了如下断言方法:

  • 基础断言:

    响应断言

    正则匹配

    响应码匹配

    jackson + beanshell断言


import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
  //获取接口返回body--实际结果
String json_response = prev.getResponseDataAsString();
  ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(json_response);
  JsonNode dataNode = rootNode.path("data");
  JsonNode totalNode = dataNode.path("total");
  String actual = totalNode.toString();
  //接口返回的总条数--期望结果
  String except = vars.getObject("program_source_data").size().toString();
  if(actual.toString().equals(except)){
    Failure = false;  

  }else{
    Failure = true;
    FailureMessage = "期待数量:"+except+" VS 实际数量:"+actual+"不一致";
  }

  • 相关接口辅助验证:

图片

  • 数据库匹配,JDBC Request + BeanShell断言,示例如下:

// JDBC Request 采样器 获取返回结果  -> triggers_count
SELECT
count(*)
FROM
  qrtz_triggers a 
WHERE
  a.JOB_NAME LIKE '%${search_key}%' ORDER BY JOB_NAME desc;
//  BeanShell断言
String except = vars.get("except_count");//期望结果
String actual = vars.get("triggers_count_1");//数据库查询到的总条数
if(actual.equals(except)){
  Failure = false;
}else{
  Failure = true;
  FailureMessage = "期待数量:"+except+" VS 实际数量:"+actual+"不一致";
}

问题六:jmeter+ant+jenkins如何改进?

jmeter+ant+jenkins是一种常用的流水线集成方法,但在集成过程中存在环境配置繁琐的问题,比如:

  • 需要安装jdk、ant、jmeter环境,版本变更还需要重新卸载安装

  • jmeter依赖第三方jar包,每次都需要手动打包上传服务器

  • jmeter配置文件变更,需要去服务器手动修改

  • jenkins中不同流水线依赖jmeter版本不一致时,需要手工安装多个jmeter版本

针对以上问题,我们采用的替代方案是 jmeter-maven-plugin + mvnw ,运行环境只需要安装jdk就可以了,将maven、jmeter版本以及第三方jar包管理,都托管到gitlab一个代码库中进行集中管理。

进行接口测试只需要git clone代码,然后执行 mvnw clean verify就可以触发测试执行。代码库配置如下图:
在这里插入图片描述

工具依赖

在这里插入图片描述

问题七:如何度量接口自动化结果?

1、jmeter原生报告优化

jmeter CLI运行方式产生的测试报告统计信息偏向性能指标,无法满足jmeter接口测试需求。因此使用dom4j解析jmeter生成的xml结果文件,使用ExtentReports5生成html报告,报告示例如下:

在这里插入图片描述
在这里插入图片描述

2、使用jacoco统计接口测试代码级覆盖率报告

接口测试用例成功率即使达到100%,仍然会存在漏测。因此使用jacoco来统计代码覆盖率,分析接口测试未覆盖的代码,进行测试用例补充完善。

关键步骤说明:

步骤1:被测服务打桩

java -javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=9002,address= * -jar 被测服务.jar

步骤2:调用jmeter脚本执行测试

./mvnw clean verify --settings=settings.xml

步骤3:dump覆盖率报告

java -jar jacococli.jar dump --address 被测服务IP --port 9002 --destfile ./jacoco1.exec

步骤4:生成覆盖率报告

java -jar jacococli.jar report ./jacoco1.exec --classfiles BOOT-INF/classes --sourcefiles /src/main/java --encoding utf-8 --html jacoReport

报告展示如下图 :
在这里插入图片描述
在这里插入图片描述

问题八:如何提升用例执行稳定性和效率?

当测试case数量持续增加时,需要考虑执行稳定性和效率。

总结如下:

预置数据代替创建过程

由于操作越多稳定性越低,使用预置数据而非实时生成的数据,速度更快,稳定性更高。

隔离

使用不同账号等进行隔离。通过隔离,用例执行失败的脏数据就不会影响其他用例;

自动化脚本测试数据与功能测试数据隔离。

jmeter配置优化

设置全局采样器超时等待,eg:timeout=12000ms , 超时自动失败;

针对性能较差的接口配置jmeter定时器 , 防止被测服务压力过大;

设置JMeterProcessJVMSettings,增大内存。

防御式编程

编写测试代码时 , 不能假设数据已存在或者没有脏数据残留,所以预先的判断和清理很重要,比如检查到数据缺失就实时修复、用例运行之前考虑清除临时数据。

不足之处,欢迎指正。

在这里插入图片描述

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!喜欢软件测试的小伙伴们,可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…


点击全文阅读


本文链接:http://zhangshiyu.com/post/33464.html

测试  接口  自动化  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1