JMeter传递token学习简易教程

2024/12/28 3:03:17

本文主要是介绍JMeter传递token学习简易教程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

概述

本文详细介绍了如何在JMeter中进行Token传递的配置和使用,包括获取Token、保存Token为变量以及在接口请求中使用Token的过程。通过示例和配置步骤,帮助读者更好地理解和实现JMeter传递Token的学习。JMeter传递token学习涵盖了从获取Token到验证Token传递正确性的全过程。

JMeter简介与安装
JMeter是什么

Apache JMeter 是一个开源的、可跨平台的性能测试工具,主要用于对网站应用进行压力测试、性能测试和负载测试。它支持多种协议,例如HTTP、HTTPS、FTP、Web Services等。JMeter广泛用于测试Web应用,能够模拟多个用户的并发请求,以评估和测试系统的性能。

如何下载并安装JMeter

JMeter的安装过程相对简单,首先需要从Apache JMeter的官方网站下载最新版本的压缩包。以下是具体步骤:

  1. 下载JMeter:访问 Apache JMeter下载页面,下载最新版本的JMeter压缩包(例如apache-jmeter-5.4.1.zip)。
  2. 解压文件:将下载的压缩包解压到你的硬盘上。例如,可以将文件解压到C:\JMeter目录。
  3. 运行JMeter:双击bin目录中的jmeter.bat(Windows)或jmeter.sh(Linux和Mac)文件,启动JMeter。
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的基本使用
创建新的测试计划
  1. 打开JMeter,选择菜单栏中的File -> New Test Plan,创建一个新的测试计划。
  2. 在左侧的树形结构中,右键点击Test Plan,选择Add -> Threads (Users) -> Thread Group,添加一个线程组。
  3. 在线程组中,可以设置线程数、循环次数等参数,例如设置线程数为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>
添加线程组和采样器
  1. 在线程组中,右键点击Thread Group,选择Add -> Sampler -> HTTP Request,添加一个HTTP请求。
  2. 在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>
运行测试计划
  1. 配置好测试计划后,点击工具栏上的绿色播放按钮(Run),执行测试计划。
  2. 在右侧面板中选择监听器,查看执行结果。例如,选择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
  1. 在测试计划中,右键点击Test Plan,选择Add -> Config Element -> HTTP Request Defaults,添加一个HTTP请求默认管理器。
  2. 在HTTP请求默认管理器中,配置请求的基础信息,例如服务器地址、端口等。
  3. 在线程组中,添加一个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
  1. 在获取Token的HTTP请求后面,添加一个BeanShell后置处理器。
  2. 在BeanShell后置处理器中,通过解析响应数据来提取Token,并将其保存为JMeter变量。
  3. 在其他需要使用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
  1. 在测试计划中,添加用户定义的变量(User Defined Variables)。
  2. 设置变量名为token,初始值为空。
  3. 在BeanShell后置处理器中,将提取到的Token赋值给该变量。
  4. 在其他接口请求中,通过引用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并传递到其他接口
  1. 创建一个HTTP请求来模拟登录,并提取Token。
  2. 使用BeanShell后置处理器提取Token并保存为变量。
  3. 在其他接口请求中,通过引用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传递失败:确保所有需要传递Token的请求中都正确引用了变量。
  • 调试技巧:使用结果树(View Results Tree)查看每个请求的详细响应数据,进行逐个排查。

通过以上步骤,你可以在JMeter中顺利传递和验证Token,确保API测试的准确性和稳定性。



这篇关于JMeter传递token学习简易教程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程