无法使用有效的URL发送带有graphql,400响应的Jmeter请求

时间:2019-12-12 16:44:34

标签: jmeter graphql performance-testing load-testing

根据我在https://graphql.org/learn/serving-over-http/Performance test for graphQL API上所读的内容,我可以通过jmeter发送graphQL请求。

在堆栈溢出示例中,使用Apollo构建了一个graphQL服务器,然后通过Jmeter查询。我只是尝试进行负载测试,而不是构建架构或数据集,因此我在本地计算机上没有Apollo,并且我也不确定如果尝试这样做,我是否会测试QA环境全部在本地。

我可以在https://proprietary-website/graphql/gql处访问我们的graphQL,如果运行以下查询,它将返回预期结果:

query currentUserProfile {
  currentUserProfile {
    id
  }
}

现在,我尝试将其应用于jmeter

  1. 我在线程组中创建一个HTTP请求,协议为:https,服务器名称:专有网站,方法:GET,路径:/ graphql / gql
  2. 我创建一个HTTP标头管理器,并包含必需的Bearer Token和Content-Type标头
  3. 我创建了一个用于查看结果树的侦听器

然后我运行500个线程的jmeter负载测试

我看到了在请求正文中传递的有效URL:

GET https://proprietary-website/graphql/gql

GET data:
{"query":{"currentUserProfile {id}"}}

[no cookies]

但我回来了:

HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Content-Length: 1555
Date: Thu, 12 Dec 2019 16:40:26 GMT

我是graphql的新手,是否不允许将Jmeter请求发送到开发人员给我的URL,我是否必须使用apollo服务器?如果是这样,有人可以给我指出一些例子吗?

我在Windows 10上

我也尝试过:

  1. k6,但这需要docker,而我的计算机上没有管理员权限
  2. easygraphql-lt,但是当我使用@ easygraphql-lt运行测试脚本时,出现依赖项错误,我不太了解如何解决
  3. 我查看了easygraphql-load-tester,但这需要我可以访问该项目,但我所拥有的只是网站。我没有要引用的graphQL.js或index.js

更新:我刚刚看到我可以将查询复制为curl请求,因此我将该请求粘贴到命令行中,这为我提供了额外的标头,这些标头可以放入我的jmeter HTTP标头管理器中:

$ curl'https://proprietary-website/graphql/gql'-H'接受编码:gzip,deflate,br'-H'内容类型:application / json'-H'接受:application / json'-H'连接: keep-alive'-H'DNT:1'-H'来源:https://proprietary-website'-H'授权:不记名的用户'--data-binary'{“ query”:“查询currentUserProfile {currentUserProfile {id}} “}'

但是我仍然得到400,所以我认为我需要以不同的方式发送查询,因为它显示为--data-binary(不确定这意味着什么)。我尝试了其他一些SO建议,但到目前为止还没有运气

我还尝试使用O'Reilly graphql书中的一个应用程序snowtooth.herokuapp.com。这比较简单,所以curl请求更加简单,并且粘贴到jmeter中的信息更少,但是我仍然收到错误:使用协议缺少HTTP GET查询:HTTP,服务器名称:snowtooth.herokuapp.com,方法:GET and Body数据:{“ query”:“ query {allLifts {name}}”},以及标头管理器中的所有必需标头

1 个答案:

答案 0 :(得分:1)

不确定proprietary website的实现是什么,但是可以像这样测试http://snowtooth.herokuapp.com/

  1. HTTP GET请求:

    enter image description here

  2. HTTP POST请求:

    enter image description here


还要注意,由于JMeter 5.1可以通过CURL命令创建JMeter测试计划,因此该http://snowtooth.herokuapp.com/为我提供了以下CURL命令:

curl 'http://snowtooth.herokuapp.com/' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: http://snowtooth.herokuapp.com' --data-binary '{"query":"{allLifts{name}}"}' --compressed

当我将其导入JMeter时,我可以成功执行请求:

enter image description here