在用量角器编写的自动化测试中,我遇到了一个奇怪的问题。我们需要测试一组通过HTTP返回JSON的API端点,而不是实际的网站,所以我的团队决定使用查克拉姆,而不是依赖Protractor。
我有一个页面对象负责访问API:
const qs = require('querystring')
const chakram = require('chakram');
function MyApi() {
const domain = // read from a configuration file
this.readImportantBusinessData = (queryParams) => {
const serviceUrl = `${domain}/services/seriousBusiness.json`;
const queryString = qs.stringify(queryParams);
const fullUrl = `${serviceUrl}?${queryString}`;
return chakram.get(fullUrl).then((response) => {
return response;
});
};
};
module.exports = new MyApi();然后,在我的一个规范中,我调用readImportantBusinessData函数来检查它是否返回预期的数据。
return MyApi.readImportantBusinessData(validParameters).then((response) => {
chakramExpect(response).to.have.status(HTTP_200_OK);
chakramExpect(response).to.have.json({
"foo" : "bar"
});
});根据我运行此代码的环境而定,测试通过或失败时会出现错误消息,这意味着没有收到任何响应。
Failed: Cannot read property 'statusCode' of undefined我可以确认我击中的服务器正在运行,并且在使用web浏览器时我可以得到正确的响应。
当我使用托管在AWS中的共享服务器时,在我的测试中所做的请求成功,而当我使用运行在VirtualBox中的本地服务器时,则失败。
为什么查克拉姆根本得不到回应呢?
发布于 2018-03-19 13:06:58
根本原因
对expect的调用只显示了undefined,但我成功地记录了整个响应对象,就像chakram.get返回的那样
{ error: { Error: self signed certificate
at TLSSocket.<anonymous> (_tls_wrap.js:1103:38)
at emitNone (events.js:106:13)
at TLSSocket.emit (events.js:208:7)
at TLSSocket.finishInit (_tls_wrap.js:637:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:467:38) code: 'DEPTH_ZERO_SELF_SIGNED_CERT' },
response: undefined,
body: undefined,
jar:
RequestJar {
jar: CookieJar { enableLooseMode: true, store: { idx: {} } }
},
url: 'https://www.example.com/myService.json?foo=bar',
responseTime: 29.524212
}这意味着Chakram与我在本地dev环境中使用的自签名证书有问题。其他服务器托管在云中,并正确设置它们的证书。
解决办法
Google快速搜索返回了许多修改全局参数的建议,该参数通过设置:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";但是,这影响到整个节点进程,而不仅仅是我的测试。这些只是我在本地运行的测试,与实际的用户数据无关。不过,如果我要使这些电话的安全性更加松懈,我需要这样做来尽可能地限制这种变化的范围。
值得庆幸的是,chakram.get使用了请求库,这使得大量定制请求成为可能。
chakram.get允许我通过:
params对象可选的附加请求选项,请参阅流行的请求库选项。
这些选项反过来允许我指定:
agentOptions-并传递它的选项。注意:有关HTTPS,请参阅用于TLS/SSL选项的tls API文档和上面的文档。
最后,在agentOptions中,可以传递一个rejectUnauthorized值,该值允许在发出单个请求时忽略证书错误。
因此,在我的页面对象中,我可以使用:
return chakram.get(fullUrl, {
agentOptions : {
//Hack to allow requests to the local env with a self-signed cert
rejectUnauthorized : false
}
}).then((response) => {
return response;
});这允许测试成功,尽管使用的是自签名证书。
解决方案
解决方案是为每个环境和域提供一个有效的证书,在这种情况下,问题首先不存在。
发布于 2018-03-25 09:56:28
这是因为它的异步和ur函数在执行时甚至没有完成chakram请求。等待请求完成才能得到响应。
https://stackoverflow.com/questions/49363762
复制相似问题