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

Posted

技术标签:

【中文标题】如何编写 jmeter 测试以在网站内提交表单(Jmeter,ruby -jmeter)【英文标题】:How to write jmeter test to submit a form within website (Jmeter, ruby -jmeter) 【发布时间】:2021-10-04 13:28:25 【问题描述】:

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

我想模拟以下步骤:

    登录 访问几页 在网站内提交表单

我首先编写了登录并访问了几个页面并成功运行它们(没有错误)。当我添加代码以提交表单时,我收到提交摘要事务的“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 建议更新:

编辑测试

请求标头:

浏览器:

Jmeter:

请求正文:

浏览器:

Jmeter:

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

【问题讨论】:

【参考方案1】:

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

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

然后在 JMeter GUI 中:

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

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

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

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

    修复您的 JMeter 配置,使其发送完全相同的请求并解决您的问题。

【讨论】:

感谢您提供详细的步骤。我尝试了您的建议,并以与我在浏览器开发人员工具中看到的相同的形式输入了所需的参数,但仍然出现与上次相同的错误:404。您能否仔细查看我编辑的帖子,显示编辑我的结果根据您的建议进行测试。

以上是关于如何编写 jmeter 测试以在网站内提交表单(Jmeter,ruby -jmeter)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JMeter 对网站进行负载测试

解析 XML 文件以在网站上使用 [重复]

在html中如何链接表单提交以在新选项卡中打开并链接相对URL?

jmeter测试数据会提交到数据库里面吗?

jmeter测试数据会提交到数据库里面吗?

Codeigniter 表单通过文件上传提交