ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Jmeter接口测试全流程实战:从环境准备到性能压测

Jmeter接口测试全流程实战:从环境准备到性能压测 我知道很多人对Jmeter的印象还停留在“一个能跑接口请求的绿色小工具”装好之后添加线程组、添加HTTP请求、填个URL、点一下运行看到结果树里是绿色就宣布测试通过。真正进入接口测试这个坑之后你会发现那一抹绿色其实什么都证明不了——没有断言没有参数关联没有对动态数据的处理跑出来的结果只能说明“请求发出去了”不能说明“接口是对的”。这篇东西就围绕Jmeter接口测试流程展开从环境准备、脚本搭建、断言设计、接口关联到上传文件、HTTPS录制、性能压测、常见错误排查把你在实际操作中一定会遇到的环节全部走一遍。适合刚转测试岗位的新人、需要自己验证接口的开发同学以及想让现有测试流程更规范一点的团队参考。1. 先把地基打牢Jmeter环境准备的细节与常见安装坑1.1 JDK版本与Jmeter版本不是随便搭的很多人在“Jmeter安装”这一步就翻了车而且翻得很委屈——明明按照教程一步步装的为什么双击jmeter.bat就是闪退或者命令行启动报UnsupportedClassVersionError。这玩意儿的根因绝大多数出在JDK版本匹配上。Jmeter本身是用Java写的它的核心库和扩展组件都要跑在特定版本的JDK上。这里有一个容易忽略的细节Jmeter 5.4.1以及更早的版本在JDK 8上跑得很舒服而Jmeter 5.5、5.6这些新版本官方已经明确要求JDK 8以上建议JDK 11或者17。如果你电脑上装的是JDK 8然后下载了最新版的Jmeter 5.6.3启动时很可能就给你抛一个class文件版本过低的错误。我的建议是不要追求“最新版”。先看你们公司测试环境普遍用的是哪个版本或者看你的JDK版本再定Jmeter版本。举个例子JDK 8就配Jmeter 5.4.xJDK 11或17就配Jmeter 5.6.x这样的组合最稳。另一个常见的坑是“明明装了JAVA_HOME还是闪退”你打开命令行执行java -version能输出版本但双击jmeter.bat就是闪退。这种情况大概率是PATH里有多个JDKJmeter启动脚本找到的Java不对或者JAVA_HOME配到了jre目录而不是jdk目录稍微检查一下环境变量就能解决。1.2 下载之后先搞清楚目录结构别只认识binJmeter的下载其实没什么玄学Apache官网直接找Binaries下面的zip包或tgz包解压就能用。但解压之后很多人只盯着bin目录里的jmeter.bat其他目录一概不碰等后面装插件、改配置的时候就开始懵了。这里我把最重要的几个目录和文件列一下收藏级的那种路径作用你迟早会用到它的时刻bin/jmeter.bat/bin/jmeter.sh启动脚本每次启动就靠它bin/jmeter.properties全局配置文件改默认编码、改语言、改端口超时bin/ApacheJMeter.jar主程序包命令行运行压测时直接用这个jarlib/依赖库目录缺JDBC驱动包、缺Kafka插件时扔这里lib/ext/插件扩展目录装第三方插件、自定义函数时扔这里bin/logs/日志目录脚本报错时第一个要翻的地方很多人第一次找插件不知道放哪里统一记住所有通过“jar包方式”安装的扩展一律放在lib/ext目录重启Jmeter才会生效。至于lib根目录主要是放第三方依赖库比如连MySQL数据库需要的mysql-connector-java.jar。这两个目录放反了不一定会报错但可能会导致部分组件加载不出来排查起来很头疼。1.3 汉化与默认编码建议第一次启动就设置好Jmeter默认是英文界面很多新手一打开就蒙圈。其实汉化很简单进入Options菜单选择Language勾选Chinese (Simplified)界面就成中文了。但这里有个坑——这个设置是临时的重启之后又变回英文。想永久汉化打开bin/jmeter.properties找到languageen这一行改成languagezh_CN去掉前面的注释符号#保存重启。汉化是小事真正要命的默认配置是编码。不做任何设置的情况下Jmeter对响应数据默认按ISO-8859-1解码中文接口返回的数据到了查看结果树里就是一片乱码。这个问题的根治办法是在jmeter.properties里把sampleresult.default.encoding改成UTF-8重启后所有请求的响应数据都会按UTF-8解析。这一点我建议所有人在动手写第一个脚本之前就做完否则后面排查问题时会怀疑人生。2. 第一个完整接口测试脚本登录接口背后藏着的五个关键配置2.1 线程组不是“并发越多越厉害”先弄清语义新建测试计划之后第一步是添加线程组。很多人从性能测试教程里学到一个概念线程数并发用户数于是做接口功能测试时也直接填50、100。这是理解偏差的源头。线程组的三个核心字段——线程数、Ramp-Up时间、循环次数——合在一起描述的是“一段持续的用户行为模型”。线程数代表同时有多少个虚拟用户在跑Ramp-Up代表这些线程在多少秒内全部启动循环次数代表每个线程把脚本跑几遍。你做接口功能测试的时候目标只是验证接口行为是否符合预期那线程数填1Ramp-Up填1秒循环次数填1就够。一次性发几十个并发接口响应稍微慢一点查看结果树里一堆红的你根本分不清是业务问题还是并发导致的服务端压力问题。那是不是功能测试就永远用1个线程也不绝对。比如你要验证某个接口有没有幂等性bug或者要造一批测试数据可以填1个线程、循环N次。但你要头脑清醒这时候的循环次数是用来“重复执行”不是模拟用户并发。简单说功能测试阶段用最小资源把问题验证清楚性能测试阶段再把线程数拉上去这个思路会让你少踩很多坑。2.2 HTTP请求参数配置JSON和表单是两码事线程组下面添加Sampler选HTTP请求。这里有个细节新手第一批翻车现场基本上都发生在这填了服务器地址、填了路径参数却不知道该填在Parameters还是Body Data。先说结论如果后端接口接收的是application/x-www-form-urlencoded格式就用Parameters内容会以keyvalue的形式拼到请求体里如果后端接收的是JSON绝大多数现代接口都是就把JSON字符串原样写到Body Data里并且在请求头中显式设置Content-Type: application/json。举个例子一个典型的登录接口协议https服务器名称或IPapi.example.com端口443方法POST路径/api/loginBody Data{username:test_user,password:Abc123456}然后右键添加一个HTTP信息头管理器添加一行Content-Type: application/json这个头不加会出现一个非常诡异的场景你在Body Data里写了标准JSON后端却告诉你“参数为空”因为很多Java后端框架默认只解析application/json类型的内容。你把JSON字符串发过去但Content-Type是代码里默认的text/plain后端解析器根本没启用。所以以后看到登录/注册接口报参数缺失先检查请求头里的Content-Type。2.3 查看结果树红色不一定错绿色不一定对脚本跑完大家第一反应都是看查看结果树。这里我要说一句可能颠覆认知的话查看结果树里的绿色只代表“请求发出去了并且收到了HTTP响应”不代表“业务成功”。你见过多少接口HTTP状态码是200但响应体里写着{code:500,msg:系统异常}这种场景在接口联调中太常见了。HTTP 200说明服务器正常处理了这次请求但业务逻辑在你的代码里是否执行成功只有后端知道。所以正确的姿势是无论状态码是什么颜色点开样本重点看两个地方一是请求体确认你发给后端的数据和你预期一致二是响应数据看后端真正返回了什么。很多测试同学一看到Http 200就截图贴到缺陷单里结果后端开发看了一眼响应体就说“这明显是我们系统内部异常你连响应都没看吗”。这个习惯一定从一开始就养好。3. 断言不将就从响应断言到Beanshell断言让接口校验真正可控3.1 响应断言覆盖80%简单场景的入门级选择接口测试没有断言等于没做测试。你跑一个登录接口返回200就认为通过那后端的密码校验逻辑是真是假你根本测不出来。给请求添加断言的方式很简单右键对应的HTTP请求选择添加 → 断言 → 响应断言。响应断言有个关键选项叫“测试字段”最常用的是响应文本也就是从完整响应体里找内容。下面那个模式匹配规则我强烈建议绝大多数情况选包含而不是匹配。原因很简单接口响应常常带一串JSON前缀、时间戳、traceId之类的东西用“匹配”要求完全相等失败率极高“包含”只要响应文本里有你指定的片段就算通过。比如登录成功返回{code:0,data:{token:xxx}}断言文本写成code:0规则选包含这就够了。但响应断言有个天然局限它做的是“子串匹配”做不了逻辑判断。比如“响应里的code等于0并且msg不等于空同时token长度大于20”这种需求响应断言就力不从心了。3.2 JSON断言面向JSON结构的官方标准答案如果接口接口返回的是标准JSON我优先推荐JSON断言。Jmeter自带这个组件它认识JSONPath语法可以直接定位到某个字段然后判断这个字段的值是否符合预期。添加位置同样在断言菜单里。配置起来很直观JSON Path表达式$.code期望值0如果JSON Path找不到字段勾选断言失败一个值得注意的点JSON断言要求响应体是“合法且完整的JSON”。有些接口在返回JSON前意外多了一条日志或者返回了带BOM头的内容JSON断言会直接报“无法解析”。这时候不要慌先回查看结果树里看原始响应文本大概率是返回数据本身不干净而不是断言配错了。3.3 Beanshell断言当内置断言兜不住复杂业务逻辑时响应断言和JSON断言能覆盖大多数校验但总有一些定制化规则它们做不了。比如要校验“响应时间小于某阈值但也不小于某阈值”或者“响应里的sign字段要等于前一个接口返回值的MD5”这时候就该上Beanshell断言了。在断言菜单里选择BeanShell断言脚本区域可以直接写Java语法的逻辑。举一个最典型的例子import org.apache.jmeter.assertions.AssertionResult; // prev 是上一个取样器的结果对象 String response prev.getResponseDataAsString(); log.info(响应内容: response); if (response null || !response.contains(\code\:0)) { Failure true; FailureMessage 业务码不为0或者响应为空响应: response; } else { // 额外校验 token 字段存在 if (!response.contains(token)) { Failure true; FailureMessage 登录接口响应中缺少token字段; } }这里面两个内置变量的含义要搞清楚prev代表当前Sampler的SampleResult你可以拿到响应文本、状态码、响应时间Failure和FailureMessage是断言结果的开关设置Failure true就代表断言失败失败原因写到FailureMessage里这样在查看结果树里能直接看到具体原因比单纯报一个“断言失败”好排查得多。不过我在这里必须说一句经验之谈Beanshell在Jmeter里的定位比较尴尬官方自己在文档里都建议新项目尽量用JSR223 Groovy替代Beanshell。原因主要有两个一是Beanshell脚本引擎的解释执行效率比Groovy低不少在压测场景下容易成为性能瓶颈二是Jmeter新版本里Beanshell相关组件的维护已经基本停滞遇到复杂JSON解析类操作Groovy配合JsonSlurper要顺手得多。所以我现在的习惯是简单场景用JSON断言实在需要写代码就用JSR223 Groovy脚本断言Beanshell只用来应付老项目里的存量脚本。4. 接口关联与动态参数谁在真正撑起多接口串联流程4.1 为什么单接口跑通了多接口串起来就废了单独测登录接口的时候响应里明明有token把token复制出来手填到下一个查询接口里也能跑通。但测试一旦要求“登录后自动查询用户信息”这种流程你就不能每次手动复制token了。真正的问题是token是动态的每个用户登录拿到的token都不一样而且过一段时间会过期。这时候就需要一种机制能够自动从上一个请求的响应里提取出关键数据传递给下一个请求。这就是接口关联要解决的事。它本质上解决的是“动态数据的跨请求传递”问题不只在Jmeter里需要Postman、Apifox这类工具也都有类似能力只是实现方式不同。4.2 JSON提取器才是首选正则表达式提取器退居二线在Jmeter里做接口关联最常用的两种提取器是JSON提取器和正则表达式提取器。我见过很多人一上来就学正则最后被各种转义字符折磨得不成人样。这里我给一个简单的选型原则只要响应是JSON优先用JSON提取器。JSON提取器的配置四个关键项变量名称比如tokenJSON Path表达式比如$.data.token匹配数字0代表随机匹配一个1代表匹配第一个默认值比如NOT_FOUND建议必须填防止提取失败时后面一长串请求全部报空指针添加完提取器后后续请求里直接写${token}就能引用。比如在HTTP信息头管理器里添加Authorization: Bearer ${token}而正则表达式提取器通常在两种场景下才有必要响应不是JSON比如XML、纯文本返回或者JSONPath不好表达的边界情况。如果你真遇到必须用正则的情况写的时候注意贪婪匹配的问题比如提取token:xxx里的xxx写成token:(.*?)时后面的问号千万别丢否则正则默认贪婪模式会把最后一个引号之前的全部内容都吞进去。4.3 While控制器让分页拉数和轮询查询不再靠人肉循环接口关联做完之后下一个高频需求是“重复执行某个请求直到满足条件”。典型场景有两个分页接口要把所有页的数据拉完异步任务接口要不断查询直到任务状态变成成功。这两个场景都可以用While控制器实现。右键线程组选择添加 → 逻辑控制器 → While控制器它的作用是让内部的请求反复执行直到条件不满足才退出。条件表达式我用得最多的是__jexl3函数因为它语法干净支持字符串比较、数字比较。举个分页拉取的例子。假设接口每次返回一页数据响应里有一个hasMore字段true表示还有下一页同时有一个pageNum字段表示当前页码。While控制器的条件可以写成${__jexl3(${pageNum} 10 ${hasMore} true,)}内部放一个HTTP请求请求参数里的页码用变量${pageNum}代替。每次请求执行完后用一个JSON提取器从响应里提取新的hasMore和pageNum更新这两个变量。这样每次循环时条件都会用最新的值重新判断直到hasMore变成false或者页码达到10。这里必须提醒一个风险**死循环是这个方案最容易踩的坑。**你条件表达式里的变量如果在提取环节提取失败了变量会一直保持初始值然后循环可能永远退不出去。我处理这个问题时有个固定的习惯在所有变量提取器的默认值里填一个会让循环结束的值同时在条件里加一个最大循环次数作为保险。比如用计数器组件从1累加到10条件里同时判断${count}小于10两层保险下来才敢让脚本挂到定时任务里跑否则一次失误就能让你的测试环境被请求轰炸到失联。5. 上传文件、HTTPS录制与证书那些容易卡住新手的场景5.1 文件上传接口的配置不是“把路径填进去”那么简单接口测试做到中后期一定会遇到文件上传。上传接口在HTTP层面用的是multipart/form-data格式和普通JSON接口完全是两套编码逻辑。Jmeter处理这个需求并不难但要配置对地方。在HTTP请求里做四件事方法选POST勾选Use multipart/form-data在Parameters里添加业务参数比如业务线ID、上传人ID在Files Upload标签页填写文件路径、参数名称、MIME类型唯一需要特别说的是参数名称这一项。很多人在这里填错名字导致后端收到的文件字段对不上返回400或者“缺少文件”。解决这个问题没有捷径去看后端的接口文档确认这个字段叫什么。比如后端定义的是file你这里就必须写file写成upload_file人家后端根本认不出来。路径方面同行传Windows电脑时经常会因为路径里的反斜杠踩坑。我的建议是文件路径尽量用绝对路径并且不要包含中文和空格。如果实在避不开路径分隔符统一用/比如D:/test_files/upload.csv比用反斜杠稳妥得多。5.2 用Jmeter自带的HTTP代理服务器录制HTTPS脚本正确理解这个功能当一个流程涉及几十个请求逐个手动添加HTTP请求效率太低这时候可以用Jmeter的录制功能。Jmeter自带一个叫HTTP代理服务器的组件它的工作原理是在本地启动一个代理端口测试本机的浏览器把流量指向这个端口Jmeter就能抓取浏览器发出的HTTP/HTTPS请求并把它们转换成测试计划里的HTTP请求Sampler。操作步骤很简单测试计划里右键选择添加 → 非测试元件 → HTTP代理服务器全局配置里设置端口比如8888目标控制器选择你准备好的线程组启动代理服务器在浏览器里把HTTP代理设置为127.0.0.1:8888正常操作浏览器把要测试的业务流程走一遍停止录制回到Jmeter里看自动生成的HTTP请求列表这里必须强调一点HTTP代理服务器在Jmeter里的定位就是测试工具自带的流量录制组件它抓的是你自己本机浏览器的请求是为了生成测试脚本用的这是接口测试工具的标准用法。弄清楚这个定位之后你就能理解为什么它需要配合本地代理设置和证书导入来使用。录制完成后生成出来的脚本基本不能直接用。因为录制会把CSS、JS、图片这些静态资源的请求也一并抓进来这些请求对接口测试毫无意义。我的习惯是先把测试计划里的请求按路径过一遍把带.css、.js、.png、.woff这类静态资源后缀的Sampler全部删掉只保留真正的业务接口然后再逐个补充断言和参数关联。5.3 HTTPS请求录制时的证书处理与更省事的替代方案录制HTTPS接口时Jmeter需要解密HTTPS流量才能看到请求明文所以会动态生成一个CA根证书默认放在bin目录下文件名类似ApacheJMeterTemporaryRootCA.crt。你需要在浏览器设置里把这个证书导入到“受信任的根证书颁发机构”列表里。导入过程中如果系统弹出安全警告确认信任即可这是测试环境里的常规操作。但说实话录制方案有个天生劣势生成的脚本很脏需要大量手工清理。我自己在很多项目里更常用一个半手动方案——打开浏览器开发者工具F12在Network面板里找到目标接口右键选择Copy as cURL拿到完整的请求字符串再根据里面的URL、请求头、请求体在Jmeter里手动创建一个HTTP请求Sampler。这种方式比录制干净比纯手写快而且对请求内容的理解更透彻。如果你的目标是“快速跑通接口行为验证”F12大法完全够用。只有当你需要“完整录制整个操作流程”或者手机端抓包时才值得去搞HTTP代理服务器录制和证书安装。6. 从接口功能测试走向性能压测跑起来之后怎么看数据6.1 压测计划在结构上就不同于功能测试功能测试确认接口逻辑没问题后下一步往往是压测。但直接在功能测试脚本上把线程数改成100大概率测出来的数据一塌糊涂。压测计划在结构设计上就跟功能测试不一样。简单说压测前你需要先明确一个问题**你到底是想看“系统在多高并发下的表现”还是想看“系统在某个目标QPS下的稳定性”。**这两个目标直接决定了线程组怎么配。如果是前者用普通线程组线程数从50、100、200逐级往上加观察响应时间的变化趋势。如果是后者更合适的做法是使用常数吞吐量定时器来把总吞吐控制在你期望的目标QPS附近让线程组只负责提供足够的并发资源。比如你想让系统维持在500 QPS下持续运行10分钟那就在线程组里把线程数调到100以上线程组用调度器配置持续时间为600秒同时加常数吞吐量定时器把Target throughput设为30000因为是每分钟吞吐量500 QPS乘以60秒等于30000。还有一个值得安利的东西是阶梯线程组也就是Ultimate Thread Group插件它允许你自定义整个压测过程中线程数的变化曲线先平稳加载多少秒、再阶梯增加、最后再保持。用内置线程组模拟这种变化需要写复杂的调度逻辑用这个插件直接填表格就行。它需要从JMeter Plugins网站下载安装插件管理器然后从插件管理器里装Custom Thread Groups。6.2 聚合报告里到底该看哪几个数90% Line为什么比平均时间重要压测跑完最常打开的监听器是聚合报告。它统计的指标很多但真正要花心思读的是这么几个指标它是什么我的使用建议Error%失败请求占比压测中只要不是0就要严肃对待不能只看红色条Throughput每秒处理的请求数衡量系统吞吐能力的核心指标90% Line90%的请求响应时间不超过这个值比Average更能代表大多数用户的真实体验99% Line99%的请求响应时间不超过这个值排查长尾慢请求时必看Average平均响应时间参考即可会被极端值拉偏举个简单的判断逻辑如果90% Line只有200ms但99% Line跑到了2000ms说明整体性能很好但有少量请求特别慢这时候要去看是不是存在偶发的GC暂停、网络抖动或者缓存穿透如果Average和90% Line都很高且Error%也在涨那你面对的更可能是服务端资源瓶颈。压测里还有一个常见误区收到红色报错就急着找开发。先看是什么类型的报错如果错误都是连接超时、Connection reset这类且压测机本地CPU已经打满问题可能出在压测机自身而不是服务端。判断方法很简单在压测机上开一个资源监视器看CPU、内存、网络的占用情况别一上来就让开发背锅。6.3 压测过程中动态调整QPSbshclient相关的实际做法压测做到高级阶段会碰到一个很真实的需求压测已经在跑了但你想在不停压测的情况下动态调整QPS比如先从100 QPS跑到5分钟想直接改成300 QPS再看效果。如果停下来改脚本再重启整个压测上下文就断了数据也不连续。这个场景下有一种可行的做法是把吞吐量定时器的目标值绑定到一个JMeter属性上然后通过BeanShell服务在压测运行时修改这个属性定时器会动态读取属性的新值。具体思路是这样在常数吞吐量定时器里把“Target throughput”的值设置为${__P(throughput, 6000)}意思是默认通过属性throughput控制每分钟请求数初始值6000。然后在Jmeter的bin/jmeter.properties里加一行# 开启BeanShell服务默认端口9000 beanshell.server.port9000 beanshell.server.file../extras/remote.bsh重启Jmeter后启动压测脚本接着登录到压测机上的远程命令行执行一段脚本就能动态改属性java -cp /path/to/jmeter/lib/ext/bsh-*.jar bsh.Interpreter进入交互模式后执行props.put(throughput, 18000);这样常数吞吐量定时器会在下一个计算周期里读到18000这个新值相当于把QPS从默认的100调到了300而整个压测计划没有暂停。这套方案里用到的BeanShell服务本质上是Jmeter提供的一个本地管理接口用来在测试运行期间修改属性和变量。它只适用于你自己的测试环境操作对象也是你本机的Jmeter实例不要把端口暴露到外部网络。这个方案我从实践下来的感受是动态调整确实可行但响应不是即时的定时器要等当前周期结束后才会重新取值所以观察数据时给一点缓冲时间别刚改完属性就盯着下一秒的输出说“没生效”。7. 大概率会踩的坑401提示、动态QPS与细节救火7.1 注册接口报“未登录请登录”这类401错误的完整排查链路很多做接口测试的朋友都遇到过这么一条报错接口访问后返回{code:401,message:未登录,请登录!}。现象很明确就是服务端认为这次请求没有通过认证。这个报错在“注册接口测试”里出现时尤其让人迷惑——我都还没注册成功呢怎么就要求登录了其实这里的“未登录”多半跟业务阶段无关而是你的请求根本没过服务端的鉴权过滤器。下面这条排查链路是我在多个项目里验证过的建议按顺序走**打开查看结果树看请求头。**点击出错的请求切到“请求体”或“HTTP”标签看实际发出的请求头里有没有Authorization或Cookie字段。如果完全没有问题基本就定位了——服务端的鉴权过滤器直接拦了你。**确定接口要求哪种鉴权方式。**打开接口文档看这个接口是需要Authorization: Bearer token还是需要Cookie里携带会话ID或者是自定义的X-Token头。很多团队在登录接口上用的是Authorization: Bearer但注册接口只校验一个简单的接口签名规则完全不同。**确认你已经做了接口关联。**如果这个接口依赖登录接口返的token确认你在登录接口后面加了提取器并且在当前请求的信息头管理器里用了${token}。这里特别要注意变量名是否拼写一致${token}和${Token}在Jmeter里是两个完全不同的变量。**确认token没有过期。**用查看结果树确认登录接口返回的token值再手动把这个token放到请求头里试一次。如果手动放进去能通自动跑不通问题就在提取或传递环节如果手动放进去还是401那就是token本身有问题要么过期了要么登录接口返回的token字段被提取错了。**如果是Cookie认证用HTTP Cookie管理器。**Jmeter自带的HTTP Cookie管理器能自动维护服务端下发的Cookie只需要把它加到线程组下Set-Cookie响应头会被自动保存并附加到后续请求中。但如果接口认证用的是HttpOnly的Cookie某些场景下Jmeter不一定能自动处理这时候还是要手动从响应里提取Cookie值。排查过程中我永远建议不要靠肉眼在几十条请求里找问题Jmeter自带一个调试取样器可以帮大忙把它放到脚本里并在变量名前缀里填上token|Cookie之类的变量名运行后它会把当前JMeter变量池里的内容全部打印到结果树里变量有没有值、值是什么一眼就能看清。7.2 中文乱码、SSL证书报错、内存溢出三个高频小问题一次说清有些问题看着不起眼但每个都能卡住半天。中文乱码的处理方法前面已经提过改jmeter.properties里的默认编码。但有一种情况改完配置文件也没用接口本身返回的就不是UTF-8而是GBK编码的字符串。这个时候可以给这个请求单独加一个BeanShell后置处理程序用一行脚本把响应体重新解码prev.setDataEncoding(GBK);SSL证书报错是另一大热门。做HTTPS接口测试时如果报PKIX path building failed优先检查Jmeter的bin目录下有没有ApacheJMeterTemporaryRootCA.crt有的话把它重新导入浏览器。如果是在命令行压测模式跑HTTPS脚本可以给JMeter脚本所在目录加上信任库参数来启动jmeter -Djavax.net.ssl.trustStore./lib/ext/truststore.jks -n -t your_test.jmx -l result.jtl内存溢出问题则多见于长时间压测。默认Jmeter启动脚本对JVM堆内存的设置是1个G压测跑久了或者线程数多了就容易报OutOfMemoryError。修改bin/jmeter.bat里的一行配置set HEAP-Xms1g -Xmx2g如果你压测脚本本身不大线程数又比较高把堆内存改成4G甚至8G都行但注意前提是压测机内存足够别改完自己电脑先卡死了。最后分享一个我自己的固定习惯每次在新电脑装好Jmeter跑第一个脚本之前一定先把jmeter.properties里的默认编码改成UTF-8再把language改成zh_CN。这两件事只用30秒却能让你在之后所有的测试周期里少处理无数个乱码和语言切换问题。接触Jmeter这几年我越来越觉得接口测试的难点从来不是某个组件不会用而是整个流程里每个环节的细节是否被照顾到了——线程组怎么配、参数放在哪、断言到底断言了什么东西、动态数据有没有传到位这些事都做到位了你的脚本才能真正替你说清楚接口到底行不行。
返回列表