自动转开发后,就很少关注性能测试方面的东西,最近在帮朋友做一个性能压测,由于朋友那边的公司比较小,环境比较简单,而且是对http服务进行的压测,所以最终
选用了jmeter来实现这个压测。
如下就是我们的场景,多个并发用户,每个用户需要先登录,而且只需要登录一次,每个并发登录成功后,会产生一个accessToken,也是就是代表了登录服务器端登录鉴权通过后,
返回给请求调用的一个标志,在后面具体的http接口请求中,每个并发用户都需要在请求中传入这个accessToken,不然的话,服务器端请求的鉴权就失败。
1、需要做登录,而且登录只需要一次即可,这个时候,我们能想到的就是用jmeter 逻辑控制器中的仅一次控制器来实现。
看下面的这个图,我们新建了一个仅一次控制器,然后在这个控制器下面添加了一个登录操作的http请求。
这是一个标准的restful 形式的登录接口。从图片中的请求路径就可以看出来。
2、你肯定也看到了,这个路径中的/MJJX/users/login/${user},${user}我们做了参数化,因为我们要支持多个并发用户。那么如何来参数化的呢,我们用了jmeter配置元件下的CSV Data Set Config组件。
下图中可以看到,我们在本地有一个参数化文件。然后设置了user,idid变量用于登录。上一步骤中的${user}变量就是从这个地方取过来的。
3、登录成功后,那么我们需要获取服务端返回的accesstoken值,这里我们使用了后置处理器下面的JSON Path PostProcessor组件来处理。我们通过json path $.data.accesstoken来获取accesstoken
注意:这里我们选择的是Sub-sanples-only。 因为我们只需要对子流程进行处理。
JsonPath的语法可以参考(参考自github):
https://github.com/json-path/JsonPath
Path Examples
Given the json
{
"store": {
"book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } }, "expensive": 10 }
JsonPath (click link to try) Result
$.store.book[*].author The authors of all books
$..author All authors
$.store.* All things, both books and bicycles
$.store..price The price of everything
$..book[2] The third book
$..book[-2] The second to last book
$..book[0,1] The first two books
$..book[:2] All books from index 0 (inclusive) until index 2 (exclusive)
$..book[1:2] All books from index 1 (inclusive) until index 2 (exclusive)
$..book[-2:] Last two books
$..book[2:] Book number two from tail
$..book[?(@.isbn)] All books with an ISBN number
$.store.book[?(@.price < 10)] All books in store cheaper than 10
$..book[?(@.price <= $['expensive'])] All books in store that are not "expensive"
$..book[?(@.author =~ /.*REES/i)] All books matching regex (ignore case)
$..* Give me every thing
$..book.length() The number of books
3、登录请求处理完之后,我们就可以处理后面压测接口的http请求了,下面这就是一个普通的post请求了。参数中传入了前面获取到的accesstoken。
4、之后就是我们常规压测时,需要添加的一些组件。比如响应断言,聚合报告,Summary Report等。
上面的都做完后,就可以开始压测了。
【原文归作者所有,欢迎转载,但是保留版权,并且转载时,需要注明出处】