Bootstrap

JMeter 实战 - HTTP请求详解

JMeter 实战 - HTTP请求详解

HTTP请求是性能测试中最常见的一种请求类型,JMeter 提供了丰富的配置选项来模拟各种HTTP请求。本文将详细介绍如何在JMeter中创建和配置HTTP请求,以及如何优化这些请求以进行有效的性能测试。

一、创建HTTP请求
  1. 新建测试计划

    • 打开 JMeter,点击菜单栏中的 File -> New,创建一个新的测试计划。
  2. 添加线程组

    • 右键点击 Test Plan,选择 Add -> Threads (Users) -> Thread Group
    • 配置线程组的参数,如用户数(Number of Threads)、启动时间(Ramp-Up Period)和循环次数(Loop Count)。
  3. 添加HTTP请求

    • 右键点击 Thread Group,选择 Add -> Sampler -> HTTP Request
    • 在取样器的配置页面中,设置以下参数:
      • Name:给取样器起一个名字(可选)。
      • Server Name or IP:目标服务器的域名或IP地址(例如 example.com)。
      • Port Number:服务器的端口号(HTTP默认端口为80,HTTPS默认端口为443)。
      • Protocol:协议类型(HTTP或HTTPS)。
      • Method:HTTP方法(GET、POST、PUT、DELETE等)。
      • Path:请求的路径(例如 /api/test)。
      • Content Encoding:请求的编码类型(如UTF-8)。
      • Parameters:请求参数(对于GET请求,参数会附加在URL后;对于POST请求,参数会作为请求体的一部分)。
二、配置HTTP请求
  1. HTTP Header Manager

    • 右键点击 Thread Group,选择 Add -> Config Element -> HTTP Header Manager
    • 添加常见的HTTP头部信息,例如Content-Type、Accept等:
      Name: Content-Type, Value: application/json
      Name: Accept, Value: application/json
      
  2. HTTP Request Defaults

    • 右键点击 Test Plan,选择 Add -> Config Element -> HTTP Request Defaults
    • 设置默认的服务器名称、端口号、协议等,这样在每个HTTP请求中就不需要重复配置这些信息。
  3. HTTP Cookie Manager

    • 右键点击 Thread Group,选择 Add -> Config Element -> HTTP Cookie Manager
    • 用于管理HTTP请求中的Cookie,可以自动存储和发送Cookie。
  4. HTTP Cache Manager

    • 右键点击 Thread Group,选择 Add -> Config Element -> HTTP Cache Manager
    • 用于模拟浏览器的缓存行为,存储响应并在后续请求中使用。
  5. HTTP Authorization Manager

    • 右键点击 Thread Group,选择 Add -> Config Element -> HTTP Authorization Manager
    • 用于配置HTTP基本认证,添加用户名和密码。
三、示例HTTP请求配置

假设我们需要测试一个简单的RESTful API,该API的URL为 http://example.com/api/test,并且需要发送一个POST请求,传递JSON格式的数据。以下是详细的配置步骤:

  1. 添加HTTP Header Manager

    • 右键点击 Thread Group,选择 Add -> Config Element -> HTTP Header Manager
    • 添加以下头部信息:
      Name: Content-Type, Value: application/json
      Name: Accept, Value: application/json
      
  2. 添加HTTP请求

    • 右键点击 Thread Group,选择 Add -> Sampler -> HTTP Request
    • 设置以下参数:
      • Name:Post Request
      • Server Name or IPexample.com
      • Protocolhttp
      • MethodPOST
      • Path/api/test
      • Body Data
        {
          "key1": "value1",
          "key2": "value2"
        }
        
  3. 添加监听器

    • 右键点击 Thread Group,选择 Add -> Listener -> View Results Tree
    • 监听器用于查看和分析请求的响应结果。
四、运行测试并分析结果
  1. 运行测试计划

    • 点击工具栏中的绿色三角按钮运行测试计划。
  2. 查看响应数据

    • View Results Tree 监听器中,选择某个请求,查看请求和响应的详细信息。
    • 确认响应中包含预期的结果。
  3. 处理和分析结果

    • 根据测试结果,可以进行进一步的性能优化,如调整线程组参数、优化服务器配置等。
五、HTTP请求的优化技巧
  1. 使用变量和参数化

    • 使用JMeter的User Defined Variables或者CSV Data Set Config来参数化HTTP请求,模拟不同用户的行为。
  2. 添加断言

    • 使用Response Assertion来验证服务器响应是否符合预期,例如检查响应代码、响应数据等。
  3. 使用定时器

    • 在请求之间添加Timer以模拟用户的思考时间和操作延迟,确保测试更加真实。
  4. 优化线程组设置

    • 根据测试需求,合理设置线程组的参数(例如用户数、启动时间、循环次数),以实现预期的负载。
六、示例代码

以下是一个完整的JMeter测试计划示例,包含HTTP请求的配置:

<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
  <hashTree>
    <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
      <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
      <elementProp name="ThreadGroup.main_controller" 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>
      <stringProp name="ThreadGroup.num_threads">1</stringProp>
      <stringProp name="ThreadGroup.ramp_time">1</stringProp>
      <longProp name="ThreadGroup.start_time">1587600000000</longProp>
      <longProp name="ThreadGroup.end_time">1587600000000</longProp>
      <boolProp name="ThreadGroup.scheduler">false</boolProp>
      <stringProp name="ThreadGroup.duration"></stringProp>
      <stringProp name="ThreadGroup.delay"></stringProp>
    </ThreadGroup>
    <hashTree>
      <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
        <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
          <collectionProp name="Arguments.arguments"/>
        </elementProp>
        <stringProp name="HTTPSampler.domain">example.com</stringProp>
        <stringProp name="HTTPSampler.port">80</stringProp>
        <stringProp name="HTTPSampler.connect_timeout"></stringProp>
        <stringProp name="HTTPSampler.response_timeout"></stringProp>
        <stringProp name="HTTPSampler.protocol"></stringProp>
        <stringProp name="HTTPSampler.contentEncoding"></stringProp>
        <stringProp name="HTTPSampler.path"></stringProp>
        <stringProp name="HTTPSampler.concurrentPool">4</stringProp>
      </ConfigTestElement>
      <hashTree/>
      <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
        <collectionProp name="HeaderManager.headers">
          <elementProp name="" elementType="Header">
            <stringProp name="Header.name">Content-Type</stringProp>
            <stringProp name="Header.value">application/json</stringProp>
          </elementProp>
          <elementProp name="" elementType="Header">
            <stringProp name="Header.name">Accept</stringProp>
            <stringProp name="Header.value">application/json</stringProp>
          </elementProp>
        </collectionProp>
      </HeaderManager>
      <hashTree/>
      <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Post Request" enabled="true">
        <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
          <collectionProp name="Arguments.arguments"/>
        </elementProp>
        <stringProp name="HTTPSampler.domain">example.com</stringProp>
        <stringProp name="HTTPSampler.port">80</stringProp>
        <stringProp name="HTTPSampler.protocol">http</stringProp>
        <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp>
        <stringProp name="HTTPSampler.path">/api/test</stringProp>
       
;