本文详细介绍了如何在JMeter中进行Token传递的配置和使用,包括获取Token、保存Token为变量以及在接口请求中使用Token的过程。通过示例和配置步骤,帮助读者更好地理解和实现JMeter传递Token的学习。JMeter传递token学习涵盖了从获取Token到验证Token传递正确性的全过程。
JMeter简介与安装 JMeter是什么Apache JMeter 是一个开源的、可跨平台的性能测试工具,主要用于对网站应用进行压力测试、性能测试和负载测试。它支持多种协议,例如HTTP、HTTPS、FTP、Web Services等。JMeter广泛用于测试Web应用,能够模拟多个用户的并发请求,以评估和测试系统的性能。
如何下载并安装JMeterJMeter的安装过程相对简单,首先需要从Apache JMeter的官方网站下载最新版本的压缩包。以下是具体步骤:
- 下载JMeter:访问 Apache JMeter下载页面,下载最新版本的JMeter压缩包(例如
apache-jmeter-5.4.1.zip
)。 - 解压文件:将下载的压缩包解压到你的硬盘上。例如,可以将文件解压到
C:\JMeter
目录。 - 运行JMeter:双击
bin
目录中的jmeter.bat
(Windows)或jmeter.sh
(Linux和Mac)文件,启动JMeter。
JMeter的界面分为几个主要部分:
- 测试计划:位于左侧树形结构的顶部,是整个测试的容器。通常包括线程组和采样器。
- 线程组:用于模拟多个用户并发访问。线程组中可以设置线程数、循环次数等。
- 采样器:用于定义具体的测试请求,例如HTTP请求、JDBC请求等。
- 监听器:用于查看和分析测试结果。常见的监听器包括查看结果树(View Results Tree)、聚合报告(Aggregate Report)等。
- 断言:用于验证响应是否符合预期。常用的断言包括简单断言(Simple Data Writer)、响应断言(Response Assertion)等。
- 配置元素:用于定义一些全局的配置,如HTTP请求默认值(HTTP Request Defaults)、用户定义的变量(User Defined Variables)等。
- 后置处理器:用于在采样器执行之后进行额外的数据处理,如正则表达式提取器(Regular Expression Extractor)、BeanShell后置处理器(BeanShell PostProcessor)等。
- 打开JMeter,选择菜单栏中的
File
->New Test Plan
,创建一个新的测试计划。 - 在左侧的树形结构中,右键点击
Test Plan
,选择Add
->Threads (Users)
->Thread Group
,添加一个线程组。 - 在线程组中,可以设置线程数、循环次数等参数,例如设置线程数为5,循环次数为10。
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="User Thread Group" enabled="true">
<elementProp guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
</collectionProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">5</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<intProp name="ThreadGroup.num_threads">10</intProp>
<intProp name="ThreadGroup.ramp_time">1</intProp>
<booleanProp name="ThreadGroup.scheduler">false</booleanProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<intProp name="ThreadGroup.loops">1</intProp>
<elementProp name="ThreadGroup.mainController" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<intProp name="LoopController.loops">1</intProp>
</elementProp>
</ThreadGroup>
添加线程组和采样器
- 在线程组中,右键点击
Thread Group
,选择Add
->Sampler
->HTTP Request
,添加一个HTTP请求。 - 在HTTP请求中,配置请求的URL、方法、参数等信息。例如,请求URL为
http://example.com/api/login
,方法为POST
。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login Request" enabled="true">
<elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="Argument">
<stringProp name="Argument.name">username</stringProp>
<stringProp name="Argument.value">admin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="password" elementType="Argument">
<stringProp name="Argument.name">password</stringProp>
<stringProp name="Argument.value">password123</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/api/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.useChunking">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSamplerProxy>
配置线程数和循环次数
在线程组中,可以设置线程数(Thread Count)和循环次数(Loop Count)。
- 线程数:代表模拟多少个用户并发访问。
- 循环次数:代表每个线程重复执行测试的次数。
<intProp name="ThreadGroup.num_threads">5</intProp>
<intProp name="ThreadGroup.ramp_time">1</intProp>
<intProp name="ThreadGroup.loops">1</intProp>
运行测试计划
- 配置好测试计划后,点击工具栏上的绿色播放按钮(
Run
),执行测试计划。 - 在右侧面板中选择监听器,查看执行结果。例如,选择
View Results Tree
,可以查看详细的响应数据。
<HTTPSampleGui>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.path">/api/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="Argument">
<stringProp name="Argument.name">username</stringProp>
<stringProp name="Argument.value">admin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="password" elementType="Argument">
<stringProp name="Argument.name">password</stringProp>
<stringProp name="Argument.value">password123</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.useChunking">false</boolProp>
<stringProp name="HTTPSampler.bytesThrough"></stringProp>
<stringProp name="HTTPSampler.codec"></stringProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.request_timeout"></stringProp>
</HTTPSampleGui>
什么是Token以及为什么需要在JMeter中传递Token
Token的概念
Token(令牌)是一种用于身份验证和授权的机制,通常是一串字符串,代表一个用户会话或状态。在Web应用中,Token通常用于替代传统的Cookie-based登录,具有更好的安全性、可移植性和灵活性。
Token在API测试中的作用Token在API测试中扮演重要角色,主要用于测试用户的认证和授权流程。通过模拟用户登录,获取Token并传递到其他接口,可以更真实地模拟用户的操作流程,验证API的安全性和功能性。
为什么要使用JMeter传递Token使用JMeter传递Token可以更好地模拟实际的用户交互场景。在进行性能测试时,传递Token可以确保测试的真实性和准确性,避免因身份验证问题导致的测试结果偏差。
如何在JMeter中配置和使用Token 使用HTTP请求默认管理器获取Token- 在测试计划中,右键点击
Test Plan
,选择Add
->Config Element
->HTTP Request Defaults
,添加一个HTTP请求默认管理器。 - 在HTTP请求默认管理器中,配置请求的基础信息,例如服务器地址、端口等。
- 在线程组中,添加一个HTTP请求,用来模拟登录请求并获取Token。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login Request" enabled="true">
<elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="Argument">
<stringProp name="Argument.name">username</stringProp>
<stringProp name="Argument.value">admin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="password" elementType="Argument">
<stringProp name="Argument.name">password</stringProp>
<stringProp name="Argument.value">password123</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/api/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.useChunking">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSamplerProxy>
<!-- HTTP Request Defaults配置代码示例 -->
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request Defaults" enabled="true">
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path"></stringProp>
<stringProp name="HTTPSampler.method"></stringProp>
</HTTPSamplerProxy>
使用BeanShell后置处理器保存Token
- 在获取Token的HTTP请求后面,添加一个BeanShell后置处理器。
- 在BeanShell后置处理器中,通过解析响应数据来提取Token,并将其保存为JMeter变量。
- 在其他需要使用Token的接口请求中,通过引用变量名来传递Token。
<BeanShellPostProcessor guiclass="BeanShellTestElementGui" testclass="BeanShellPostProcessor" testname="BeanShell PostProcessor" enabled="true">
<stringProp name="beanshell.postprocessor.filename"></stringProp>
<stringProp name="beanshell.postprocessor.parameters"></stringProp>
<stringProp name="beanshell.postprocessor.script">
<![CDATA[
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// 获取响应数据
String response = prev.getResponseDataAsString();
// 正则表达式匹配Token
Pattern p = Pattern.compile("token\":\"(.*?)\"");
Matcher m = p.matcher(response);
if (m.find()) {
// 提取Token并保存为变量
vars.put("token", m.group(1));
} else {
System.out.println("Token not found");
}
]]>
</stringProp>
</BeanShellPostProcessor>
使用用户定义的变量传递Token
- 在测试计划中,添加用户定义的变量(User Defined Variables)。
- 设置变量名为
token
,初始值为空。 - 在BeanShell后置处理器中,将提取到的Token赋值给该变量。
- 在其他接口请求中,通过引用
token
变量来传递Token。
<elementProp name="User Defined Variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="token" elementType="Argument">
<stringProp name="Argument.name">token</stringProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
示例:通过登录接口获取Token并传递到其他接口
- 创建一个HTTP请求来模拟登录,并提取Token。
- 使用BeanShell后置处理器提取Token并保存为变量。
- 在其他接口请求中,通过引用Token变量来传递Token。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login Request" enabled="true">
<elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="Argument">
<stringProp name="Argument.name">username</stringProp>
<stringProp name="Argument.value">admin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="password" elementType="Argument">
<stringProp name="Argument.name">password</stringProp>
<stringProp name="Argument.value">password123</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/api/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.useChunking">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSamplerProxy>
<BeanShellPostProcessor guiclass="BeanShellTestElementGui" testclass="BeanShellPostProcessor" testname="BeanShell PostProcessor" enabled="true">
<stringProp name="beanshell.postprocessor.filename"></stringProp>
<stringProp name="beanshell.postprocessor.parameters"></stringProp>
<stringProp name="beanshell.postprocessor.script">
<![CDATA[
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// 获取响应数据
String response = prev.getResponseDataAsString();
// 正则表达式匹配Token
Pattern p = Pattern.compile("token\":\"(.*?)\"");
Matcher m = p.matcher(response);
if (m.find()) {
// 提取Token并保存为变量
vars.put("token", m.group(1));
} else {
System.out.println("Token not found");
}
]]>
</stringProp>
</BeanShellPostProcessor>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Protected Request" enabled="true">
<elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="token" elementType="Argument">
<stringProp name="Argument.name">token</stringProp>
<stringProp name="Argument.value">${token}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/api/protected</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.useChunking">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSamplerProxy>
验证Token传递是否成功
查看响应数据验证Token是否正确传递
在HTTP请求中,可以通过查看响应数据来验证Token是否正确传递。确保响应中包含预期的数据或状态码。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Protected Request" enabled="true">
<elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="token" elementType="Argument">
<stringProp name="Argument.name">token</stringProp>
<stringProp name="Argument.value">${token}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/api/protected</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.useChunking">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSamplerProxy>
使用断言验证Token传递的正确性
在HTTP请求中,可以添加断言(Assertion)来验证响应是否符合预期。
- 简单断言:验证响应中是否包含特定字符串。
- 响应断言:验证响应代码是否为200。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Protected Request" enabled="true">
<elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="token" elementType="Argument">
<stringProp name="Argument.name">token</stringProp>
<stringProp name="Argument.value">${token}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/api/protected</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.useChunking">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<elementProp name="HTTPsampler.assertions" elementType="Assertion" guiclass="AssertionGui" testclass="Assertion" testname="Response Assertion" enabled="true">
<boolProp name="Assertion.runTest">true</boolProp>
<boolProp name="Assertion.ignoreBlank">false</boolProp>
<stringProp name="Assertion.testType">0</stringProp>
<stringProp name="Assertion.responseAssertion.testString">200</stringProp>
<collectionProp name="Assertion.responseAssertion.responseCodes">
<stringProp name="47000">200</stringProp>
</collectionProp>
<boolProp name="Assertion.responseAssertion.successFromParser">true</boolProp>
<boolProp name="Assertion.responseAssertion.includeDst">*</boolProp>
<boolProp name="Assertion.responseAssertion.includeDst">\</boolProp>
<boolProp name="Assertion.responseAssertion.includeDst">/</boolProp>
<boolProp name="Assertion.responseAssertion.includeDst">?</boolProp>
</elementProp>
</HTTPSamplerProxy>
检查测试结果是否符合预期
在运行测试计划后,可以通过查看结果树(View Results Tree)或聚合报告(Aggregate Report)来检查测试结果是否符合预期。
- 结果树:查看每个请求的具体响应数据。
- 聚合报告:查看整体性能指标,如响应时间、吞吐量等。
<resultTree>
<result>
<responseCode>200</responseCode>
<responseMessage>OK</responseMessage>
<threadName>main</threadName>
<dataEncoding>UTF-8</dataEncoding>
<responseData>
<![CDATA[{"message": "Token validated successfully."}]>
</responseData>
</result>
</resultTree>
常见问题及解决方法
Token传递失败的常见原因及解决办法
- Token未正确提取:检查正则表达式是否正确匹配Token,如果需要,调整正则表达式。
- Token未传递:确保在获取Token的请求中正确配置了后置处理器,并正确引用了变量。
- Token过期或不正确:确认登录请求成功并检查响应数据中的Token是否有效。
- 优化网络请求:减少不必要的网络请求,例如合并多个请求为一个。
- 使用缓存:在测试计划中使用缓存机制,避免重复获取Token。
- 增加线程并发度:适当增加线程并发度,提高测试效率。
- 调整测试计划设置:优化线程组中的线程数和循环次数,确保测试计划合理。
- 错误提示:Token未找到:检查正则表达式是否匹配正确,确保响应数据中包含Token。
- 错误提示:Token传递失败:确保所有需要传递Token的请求中都正确引用了变量。
- 调试技巧:使用结果树(View Results Tree)查看每个请求的详细响应数据,进行逐个排查。
通过以上步骤,你可以在JMeter中顺利传递和验证Token,确保API测试的准确性和稳定性。
共同学习,写下你的评论
评论加载中...
作者其他优质文章