一、背景
现因系统需要对接各种第三方平台,但是因为:
- 需要检查发送给第三方的请求是否正确
- 在第三方未完成功能时,需要模拟桩来模拟第三方各种响应,代码做相应的处理
- 在测试环境时,无法对接到正式的代码,故需要模拟桩来模拟第三方
故使用MockLab来模拟第三方平台,辅助测试人员测试。
MockLab不仅仅可以应用于这些场景,还可以:
- 后台开发人员模拟第三方平台的响应来自测代码是否处理正确
- 前端开发人员可以模拟后台处理代码的响应来辅助前端页面开发
二、前言
MockLab是基于WireMock,类同于WireMock的在线版,地址为MockLab。
MockLab需要注册账户并登录后才可以使用,且免费版对api的个数有要求,具体参考MockLab的说明文档。
详细内容可以参考说明文档。
三、简易流程
1.新增Mock API
输入APIname、hostname,保存即可。
2.新增API
输入name、url和response,保存即可。
3.发送请求测试
四、操作指导
4.1请求匹配
4.1.1匹配URLs
- path :匹配URL的路径,不匹配查询部分
- path + query:匹配URL的路径和查询部分
例如:匹配规则是
/my/path?q=abc&limit=10
请求URL是
A:https://my-api.mocklab.io/my/path?q=abc
B:https://my-api.mocklab.io/my/path?q=abc&limit=10
C:https://my-api.mocklab.io/my/path
D:https://my-api.mocklab.io/my/path?randomqueryparam=123
如果匹配策略是path时,ABCD都可以匹配。
如果匹配测试是path + query时,B才可以匹配,ACD匹配失败。
- Path regex:使用正则表达式匹配URL的路径,不匹配查询部分
- path + queryregex:使用正则表达式匹配URL的路径和查询部分
例如:匹配规则是
/users/[0-9]+?q=[a-zA-Z]{1,4}&limit=10
请求URL是
A:/users/1
B:/users/9832749823?q=abc&limit=10
C:/users/321?q=abcde&limit=10
D: /users/9832749823?p=abc&limit=10
如果匹配策略是pathregex时,ABCD都可以匹配。
如果匹配测试是path + query regex时,B才可以匹配,ACD匹配失败。
- Any URL:匹配任何请求URL,该情况下可以使用其他方式来匹配
4.1.2匹配JSON请求
equalToJson
仅当输入JSON中的所有元素都与期望的JSON相同,数组的顺序相同并且不存在其他元素时,才会匹配。字典中的元素顺序不会影响匹配。
可选择:
- 忽略list顺序的差异:勾选后list的元素的顺序不影响匹配。
- 忽略额外的对象属性:勾选后字典中多了额外的元素也不会影响匹配。
如果要检查是否存在某个元素,但是不在乎值是什么,则可以使用JSONUnit占位符语法来实现。使用${json-unit.ignore}时,元素的类型也将被忽略(除了其值之外)。
如果要将元素限制为特定类型,但仍然忽略该值,则可以使用以下占位符之一:
${json-unit.regex}[A-Z]+ (可以使用任何Java风格的正则表达式)
${json-unit.any-string}
${json-unit.any-boolean}
${json-unit.any-number}
matchesJsonPath
允按照指定的Xpath路径去匹配元素。
可选择:
- equalTo:仅当输入字符串恰好等于期望值时才匹配
- Contains:如果输入字符串包含期望值,则匹配
- Matches regex:将输入字符串与Java样式正则表达式匹配
- Ispresent:当该元素存在,则匹配
常见的匹配示例:
1.按位置匹配特定数组元素
$.sizes[1]
equal to
M
将匹配:
{
"sizes":["S", "M", "L"]
}
匹配通过另一个元素找到的对象的一个元素。
$.addresses[?(@.type == 'business')].postcode
contains
N11NN
将匹配:
{
"addresses":[
{
"type":"home",
"postcode":"Z55ZZ"
},
{
"type":"business",
"postcode":"N11NN"
}
]
}
contains
在此实例中必须使用包含查询部分(在[?
和之间]
)的JSONPath表达式,该表达式将始终返回结果集合。
递归匹配匹配的元素。
$..postcode
contains
N11NN
将匹配:
{
"addresses":[
{
"type":"home",
"postcode":"Z55ZZ"
},
{
"type":"business",
"postcode":"N11NN"
}
]
}
并且还将匹配:
{
"address":{
"type":"business",
"postcode":"N11NN"
}
}
4.1.3匹配XML正文
Xml和json的匹配方式有些类似。
equalToXml
匹配操作者进行对照预期XML输入XML的语义比较,它会忽略空白中的差异、忽略元素和属性顺序。如果所有元素和属性都存在,具有相同的值并且没有其他元素或属性,则默认情况下会将输入与期望的XML匹配。
如果要检查是否存在某个元素,但是不在乎值是什么,则可以使用XMLUnit占位符语法来实现。使用${xmlunit.ignore实现。
matchesXPath
允按照指定的Xpath路径去匹配元素。
常见的匹配示例:
按位置匹配元素
/things/thing[@name = 'socks']
将匹配:
{
"sizes":["S","M","L"]
}
匹配通过另一个元素找到的对象的一个元素。
$.addresses[?(@.type == 'business')].postcode
contains
N11NN
将匹配:
<things>
<thingname="socks"></thing>
<thingname="shoes"></thing>
<