0

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

我想模拟以下步骤:

  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 建议更新:

编辑测试 在此处输入图像描述

请求标头:

浏览器:

在此处输入图像描述 在此处输入图像描述

仪表:

在此处输入图像描述

请求正文:

浏览器:

在此处输入图像描述 在此处输入图像描述

仪表:

在此处输入图像描述

结果:提交抽象事务仍然出现 404 错误

在此处输入图像描述

4

1 回答 1

0

HTTP 状态 404表示服务器找不到请求的资源,因此很可能您的 URL 是错误的。

因此,请仔细检查 URL 是否为登录用户返回了有效响应,如果确实如此 - 使用浏览器开发人员工具https://myapp.herokuapp.com/users/2/abstracts/new捕获创建新“抽象”的请求

然后在 JMeter GUI 中:

  1. 在https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group中将线程数、加速周期和循环计数更改为 1

    在此处输入图像描述

  2. 调试后处理器添加到您的测试计划(它将允许您查看 JMeter 变量的值)

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

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

    在此处输入图像描述

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

于 2021-10-04T14:22:18.477 回答