如何编写 jmeter 测试以在网站内提交表单(Jmeter,ruby -jmeter)

How to write jmeter test to submit a form within website (Jmeter, ruby -jmeter)

我正在为我的应用程序编写负载测试。

我想模拟以下步骤:

  1. 登录
  2. 访问多个页面
  3. 在网站内提交表格

我首先写了登录名并访问了几个页面并且 运行 他们成功了(没有错误)。当我添加代码以提交表单时,提交摘要事务出现“404/未找到错误”。

非常感谢任何能为我提供解决方法的指导。

我使用 ruby 编写了此测试脚本,然后执行将其转换为 .jmx 文件,我将其用于 运行 在 cli 中进行无头测试。

登录并访问多个页面的代码:

require 'ruby-jmeter'

test do
  threads count: 100, rampup: 60, loops: 10, duration: 120 do
    defaults domain: 'myapp.herokuapp.com', protocol: 'https'
    cookies policy: 'rfc2109', clear_each_iteration: true

    transaction 'Page Load Tests' do
      user_defined_variables [{name: 'email', value: 'example@example.com'}, {name: 'password', value: 'Pass_w0rd'}]
      visit name: 'Visit Login', url: '/users/sign_in' do
        extract name: 'csrf-token', xpath: "//meta[@name='csrf-token']/@content", tolerant: true
        extract name: 'csrf-param', xpath: "//meta[@name='csrf-param']/@content", tolerant: true
        extract name: 'authenticity_token', regex: 'name="authenticity_token" value="(.+?)"'
      end
    end

    http_header_manager name: 'X-CSRF-Token', value: '${csrf-token}'
    submit name: 'Submit login', url: '/users/sign_in',
     fill_in: {
       '${csrf-param}' => '${csrf-token}',
       'user[email]' => '${email}',
       'user[password]' => '${password}',
       'authenticity_token' => '${authenticity_token}'
      }
    visit name: 'Welcome Page', url: '/static_pages/welcome'
    visit name: 'New Abstract Page', url: '/users/2/abstracts/new'
    visit name: 'My Profile Page', url:'/users/2/participations/1/profile'
    visit name: 'My Own Abstract Page', url:'/users/2/participations/1/abstracts/1'

  view_results_in_table
  aggregate_report
end.jmx

登录、访问页面和提交表单的代码:

require 'ruby-jmeter'

test do
  threads count: 100, rampup: 60, loops: 10, duration: 120 do
    defaults domain: 'myapp.herokuapp.com', protocol: 'https'
    cookies policy: 'rfc2109', clear_each_iteration: true

    transaction 'Page Load Tests' do
      user_defined_variables [{name: 'email', value: 'example@example.com'}, {name: 'password', value: 'Pass_w0rd'}]
      visit name: 'Visit Login', url: '/users/sign_in' do
        extract name: 'csrf-token', xpath: "//meta[@name='csrf-token']/@content", tolerant: true
        extract name: 'csrf-param', xpath: "//meta[@name='csrf-param']/@content", tolerant: true
        extract name: 'authenticity_token', regex: 'name="authenticity_token" value="(.+?)"'
      end
    end

    http_header_manager name: 'X-CSRF-Token', value: '${csrf-token}'
    submit name: 'Submit login', url: '/users/sign_in',
     fill_in: {
       '${csrf-param}' => '${csrf-token}',
       'user[email]' => '${email}',
       'user[password]' => '${password}',
       'authenticity_token' => '${authenticity_token}'
      }
    visit name: 'Welcome Page', url: '/static_pages/welcome'
    visit name: 'New Abstract Page', url: '/users/2/abstracts/new'
    visit name: 'My Profile Page', url:'/users/2/participations/1/profile'
    visit name: 'My Own Abstract Page', url:'/users/2/participations/1/abstracts/1'

    transaction 'Submit Abstract' do
      visit name: 'New Abstract Page', url: '/users/2/abstracts/new' do
        extract name: 'csrf-token', xpath: "//meta[@name='csrf-token']/@content", tolerant: true
        extract name: 'csrf-param', xpath: "//meta[@name='csrf-param']/@content", tolerant: true
        extract name: 'authenticity_token', regex: 'name="authenticity_token" value="(.+?)"'
      end

      http_header_manager name: 'X-CSRF-Token', value: '${csrf-token}'
      submit name: 'Submit Abstract', url: '/users/2/abstracts/new',
        fill_in: {
          '${csrf-param}' => '${csrf-token}',
          'abstract[title]' => 'Lorem Ipsum',
          'abstract[main_author]' => '2',
          'abstract[co_authors][]' => ["", "1", "3"],
          'abstract[corresponding_author_email]' => '${email}',
          'abstract[keywords]' => 'word, words',
          'abstract[body]' => 'The test directive is a root point, where all the magic starts. Then, using threads method we are telling JMeter what number of users we want to use. The defaults command allows us to specify default options for all our http requests. And, finally,cookies indicates that we need to store cookies and send them with each request.',
          'abstract[references]' => '1\r\n2\r\n3',
          'authenticity_token' => '${authenticity_token}'
        } do
          assert 'contains' => 'Abstract submission completed.'
          assert 'contains' => 'Lorem Ipsum'
      end
    end
  end

  view_results_in_table
  aggregate_report
end.jmx

根据@DMITRI T 建议更新:

已编辑测试

请求HEADER:

浏览器:

Jmeter:

请求BODY:

浏览器:

Jmeter:

结果: 提交摘要交易仍然出现 404 错误

HTTP Status 404 表示服务器找不到请求的资源,所以很可能你的 URL 是错误的。

因此请仔细检查 https://myapp.herokuapp.com/users/2/abstracts/new returns 的 URL 是否对已登录用户有效响应,如果是 - 捕获创建新“摘要”的请求,使用你的 browser developer tools

然后在 JMeter GUI 中:

  1. https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group

    中将线程数、加速期和循环计数更改为 1

  2. Debug Post-Processor 添加到您的测试计划(它将允许您查看 JMeter 变量的值)

  3. View Results Tree 侦听器添加到您的测试计划(它将允许查看请求和响应详细信息)

  4. 运行 您在 JMeter GUI 中的测试,检查 Submit Abstract 请求详细信息并与您在浏览器开发人员工具中看到的内容进行交叉检查 - 请求必须绝对是相同(除了动态参数)

  5. 修复您的 JMeter 配置,以便它发送完全相同的请求并且应该可以解决您的问题。