responses常用设置
响应这块主要分三部分:代理模式、脚本注入以及利用shell脚本的动态行为。
代理
代理是mb是responses的一个配置项,与注射相媲美,支持记录、缓存行为,可以对其head、body进行修改,
可轻松捕获测试场景的丰富测试数据集。
代理就是给个地址,代理访问下录制各种场景的响应报文,录制以后我们可以设为静态服务响应数据。
"stubs": [{
"responses": [{
"proxy": {
"to": "http://localhost:8083/mockjs"
....
}
}]
}]
proxy参数如下:
参数 | 默认 | 类型 | 描述 |
---|---|---|---|
to | 需要 | 代理的url地址,带http的全路径 | 定义请求应代理的源服务器。 |
predicateGenerators | [] | 数组 | 一组对象,用于定义如何创建新存根的谓词,就是为了生成谓词的配置,数组中的每个对象都定义了从中生成谓词的字段。请参阅下面 的示例。 |
mode | proxyOnce | proxyOnce、proxyAlways、proxyTransparent | proxyOnce 相同的条件只访问代理地址一次,获取的响应数据会缓存在本地。proxyAlways缓存所有响应数据,要和mb replay 配合使用,否则缓存数据越来越多,proxyTransparent模式代理请求但不记录任何数据 |
addWaitBehavior | false | 布尔 | 如果为true,则mountebank将以wait 与代理调用相同的延迟为响应添加行为。这在您希望模拟正在虚拟化的下游服务的实际延迟的性能测试场景中非常有用。 |
addDecorateBehavior | null | 字符串,JavaScript | 对已缓存的响应修改数据 |
从这几个参数开始我们逐步学习下mb的代理功能。
predicateGenerators 请求的条件判断
predicateGenerators 数组中的每个对象都包含以下字段:
参数 | 默认 | 类型 | 描述 |
---|---|---|---|
matches | {} | 宾语 | 用于定义如何创建新存根的谓词,关键是定义、新建,相当于代码生成模板 |
caseSensitive | false | 布尔 | 确定匹配是否区分大小写,包括查询参数等对象的key。 |
except | "" | 串 | 定义在匹配之前从请求字段中剥离的正则表达式。 |
xpath | null | 宾语 | (业务场景不多,可忽略)定义包含selector字符串的对象,以及可选的ns定义命名空间映射的 对象字段。谓词的范围仅限于请求字段中的选定值。 |
jsonpath | null | 宾语 | 业务场景不多,可忽略)定义包含selector字符串的对象。谓词的范围仅限于请求字段中的选定值。 |
如下面的代码设置matches的一个值为query。
"stubs": [{
"responses": [{
"proxy": {
"to": "http://localhost:8083/mockjs",
"predicateGenerators": [{
"matches": {
"query": { "q": "mountebank" }
}
}]
}
}]
}]
那么访问 http://localhost:8082/mockjs?q=mountebank 以后生成的谓词如下:
"stubs": [
{
"predicates": [{
"equals": {
"query": { "q": "mountebank" }
}
}],
"responses": [{
"is": { ... }
}]
}
]
如果是 http://localhost:8082/mockjs?q=mountebank1 ,那么生成的谓词是"query": { "q": "mountebank1" }
mode定义代理的行为
proxyOnce - 确保相同的请求(由谓词定义)永远不会被代理两次。mountebank仅记录每个请求的一个响应,并在下次请求谓词匹配时自动重放该响应。
proxyAlways - 将代理所有呼叫,允许为同一逻辑请求保存多个响应。利用这个模式必须及时把代理删除,否则生成的谓词将很多,
mb replay --port 2525
#命令执行后,代理模式清除,只有录制的谓词提供服务
proxyTransparent - 请求访问透传不做记录处理。
injectHeaders修改请求头
顾名思义就是通过代理请求而相应数据的http的head追加一些属性。
"responses": [{
"proxy": {
"to": "http://localhost:8083/mockjs",
"mode": "proxyOnce",
"addWaitBehavior": true,
"injectHeaders": {
"X-My-Custom-Header-One": "my first value",
"X-My-Custom-Header-Two": "my second value"
}
}}]
那么会在响应的head上追加了两行数据,具体如下:
Cache-Control →no-cache
Postman-Token →5aa8b6d1-c6aa-4660-93b5-af416bb87b55
host →localhost:8083
cookie →BDSVRTM=0
accept-encoding →gzip, deflate
Connection →keep-alive
X-My-Custom-Header-One →my first value
X-My-Custom-Header-Two →my second value
Date →Sun, 19 May 2019 15:28:21 GMT
Transfer-Encoding →chunked
mb考虑的很周到,通过代理可以录制谓词,录制的数据可以提供修改http的head、body,那么下面就是介绍下怎么修改响应的数据了。
addDecorateBehavior修改已保存的响应
"responses": [{
"proxy": {
"to": "http://localhost:8083/mockjs"
},
"addDecorateBehavior": "<%- stringify(filename, './test/proxy.ejs') %>"
}
}]
//proxy.ejs代码,也是通过EJS模板调用,便于代码熟悉及维护
function(request, response) {
response.body = response.body + ' DECORATED!123456';
console.log("function(request, response)");
}
那么生成的代码如下:
"_behaviors": {
"decorate": "function(request, response) {\r\n\tresponse.body = response.body + ' DECORATED!123456';\n\tconsole.log(\"function(request, response)\");\r\n}"
}
addWaitBehavior
还有一个重要的参数,那就是addWaitBehavior,当为true时会记录代理请求的响应时间,方便录制的数据回放时比较逼真,说白了就是完全模拟回访。
"responses": [{
"proxy": {
"to": "http://localhost:8083/mockjs",
"addWaitBehavior": true
}
}]
那么生成的代码
"_behaviors": {
"wait": 534
}
//534就是响应的时间
最后mb的代理就这样结束了,为了全面的了解,我把它贴出来:
//代理demo
{
"port": 8082,
"protocol": "http",
"stubs": [{
"predicates": [{
"deepEquals": {
"path": "/mockjs"
}
}],
"responses": [{
"proxy": {
"to": "http://localhost:8083/mockjs",
"mode": "proxyOnce",
"addWaitBehavior": true,
"injectHeaders": {
"X-My-Custom-Header-One": "my first value",
"X-My-Custom-Header-Two": "my second value"
},
"predicateGenerators": [{
"matches": {
"query": {
"q": "mountebank"
}
}
}],
"addDecorateBehavior": "<%- stringify(filename, './test/proxy.ejs') %>"
}
}]
}
]
}
http://localhost:8082/mockjs?q=mountebank2 访问生成的谓词代码:
{
"predicates": [{
"equals": {
"query": {
"q": "mountebank2"
}
}
}],
"responses": [{
"is": {
"statusCode": 200,
"headers": {
"User-Agent": "PostmanRuntime/7.11.0",
"Accept": "*/*",
"Cache-Control": "no-cache",
"Postman-Token": "5aa8b6d1-c6aa-4660-93b5-af416bb87b55",
"host": "localhost:8083",
"cookie": "BDSVRTM=0",
"accept-encoding": "gzip, deflate",
"Connection": "keep-alive",
"X-My-Custom-Header-One": "my first value",
"X-My-Custom-Header-Two": "my second value",
"Date": "Sun, 19 May 2019 15:28:21 GMT",
"Transfer-Encoding": "chunked"
},
"body": "{\n \"head\": {\n \"rspcode\": \"200\"\n },\n \"body\": {\n \"city\": \"山南地区\"\n }\n}",
"_mode": "text",
"_proxyResponseTime": 534
},
"_behaviors": {
"wait": 534,
"decorate": "function(request, response) {\r\n\tresponse.body = response.body + ' DECORATED!123456';\n\tconsole.log(\"function(request, response)\");\r\n}"
}
}]
}
系统测试利器之挡板实战(一)
系统测试利器之挡板实战(二)
系统测试利器之挡板实战(三)
系统测试利器之挡板实战(五)
系统测试利器之挡板实战(六)
系统测试利器之挡板实战终结(七)