之前写了在移动端测试自动化中利用 AnyProxy Mock 数据,测试埋点功能
以前的方案里,所有用例需要的代理规则都写在 AnyProxy 的 rule 文件里,有个变量做开关,默认关闭,在每个 Mocha 用例里通过修改共享的变量打开需要的规则
写了一阵后发现 rule 文件越来越长,阅读调试的时候脑力负担非常重,所以换了个写法,新代码在 master 分支
还是 rule.js 和 Mocha 的用例共享一个 JSON 对象 rewriteRules,这个 JSON 的 key 是一个 url,value 是一个函数,这个函数的入参是 AnyProxy 截获的 Request 或者 Response
在用例里,如果有个操作触发的请求需要被修改,就在这个操作前把 url 和 value 加到 rewriteRules 里
const { rewriteRules } = require('../rules') // 和 AnyProxy 共享的 JSON
...
it('case', function () {
const title = Date.now()
rewriteRules.responses = {}
rewriteRules.responses['testerhome.com/api/v3/topics.json'] = (response) => {
response.topics[index].title = title
return response
}
...
assert.equal(element.getText(), title)
})
在 AnyProxy 里,每次将 Response 发给 App 之前,都会检查一下这次的 url 在不在 rewriteRules 里,如果在的话,就用对应的函数处理 Response,处理完再发给 App
const rewriteRules = { 'responses' : {} }
module.exports = {
rewriteRules: rewriteRules,
*beforeSendResponse(requestDetail, responseDetail) {
const hostAndPath = requestDetail.requestOptions.hostname + requestDetail.requestOptions.path.split('?')[0]
if (rewriteRules.responses.hasOwnProperty(hostAndPath)) {
const newResponse = responseDetail.response
const jsonResponse = JSON.parse(newResponse.body.toString())
const rewrite = rewriteRules.responses[hostAndPath] // 这是从用例里拿到的处理函数
newResponse.body = JSON.stringify(rewrite(jsonResponse))
return {
response: newResponse
}
}
}
}