我正在尝试对需要登录的路由进行负载测试。
我之前使用https://artillery.io/docs/index.html用于已注销的路线,但工作正常。对于已登录的路由,我尝试使用函数调用beforeRequest
来设置请求标头和放大器。体。
config:
target: "https://www.mywebsite.com/"
phases:
- duration: 60
arrivalRate: 50
processor: "test.js"
scenarios:
- flow:
- post:
url: "/login"
beforeRequest: "setReqBody"
我的beforeRequest看起来像这样:
function setReqBody(requestParams, context, ee, next) {
requestParams.body = {'email': 'user@mail.com', 'password': 'password', '_csrf_token': window.csrfToken}
return next();
}
我收到window
未定义的错误。
我环顾四周,看看是否还有其他我可以用来负载测试凤凰,但没有太多运气。有没有其他方式我可以登录&测试那些路线?或者我可以使用其他依赖项/库来执行此操作?
答案 0 :(得分:2)
问题是window
未在beforeRequest
函数运行的上下文中定义(因为代码未在浏览器中运行)。
如果CSRF令牌包含在登录页面的DOM / HTML中的某个位置,您可以先抓取它然后将其包含在POST请求中。例如,如果登录表单包含一个隐藏的输入,其中包含name
attribute = csrfToken
的CSRF令牌:
scenarios:
- flow:
# Get the login page and grab the CSRF token
- get:
url: "/login"
capture:
selector: "input[name='csrf_token']"
attr: "value"
as: "csrfToken"
# Useful for debugging: check that we used the right selector:
- log: "Extracted CSRF token: {{ csrfToken }}"
# Now send a login request:
- post:
url: "/login"
form:
email: "user@mail.com"
password: "password123"
_csrf_token: "{{ csrfToken }}"
# The session cookie will be remembered and reused automatically by
# Artillery from this point onwards.
答案 1 :(得分:1)
考虑使用https://gist.github.com/anonymous/b651408a8419f13a949d719e6b87d8ea,它有:
有关详细信息,请参阅HTML Reporting Dashboard。