初めに
手動テストリストの中でE2Eにできるテストはないものかと血眼になってネタを探していたところ、POSTMANを使って手動でREST APIを実行しているテストがあった。
CodeceptJSで自動化できるのでは?とREST APIの実行方法を模索していた中でぶち当たった問題の記録である。
何が起こったか
In
パラメータを渡すと、その値をそのままOut
に返却するGet APIをテストするサンプルプログラムを作成した。
Feature("API実行");
const ScenarioGet = "GET";
Scenario(ScenarioGet, async () => {
// APIの実行
const response = await I.sendGetRequest("/sample/get?In=hoge");
// HTTPレスポンスが成功であることの確認
I.seeResponseCodeIsSuccessful();
// レスポンスボディが正しいことの確認
I.seeResponseContainsJson({Out: "hoge"});
});
ところが実行してみるとI.seeResponseCodeIsSuccessful()
の検証でHTTPレスポンスコードが503
で返却されている。
503といえば、サーバからの一時的な障害などで処理ができない旨のエラーである。
そこで、Webブラウザから同じAPIを実行して再現するかを確認したところ、エラーなく実行された。
一時的な問題かと思ったが、何度実行しても同じ結果になるため、CodeceptJSでの実行に問題がある様子。
調査
以下の2つの可能性を考えた。
- CodeceptJSのConfigに問題がある
- Proxyなどを含むネットワーク関係の問題
「CodeceptJSのConfigに問題がある」については否定できないものの、Codeceptjsのソース上にDebug出力を仕込んだ。最終的にどのようなアクセスをしているか、どのようなレスポンスが得られているか等を確認したうえで問題がないと結論付けた。
「Proxyなどを含むネットワーク関係の問題」については以前CodeceptJS上でテストを実施したことのあるサーバと同じURLだったので可能性は低いとも考えた。しかし、HTTPリクエストに対して503が返る、タイムアウトする場合はProxyが関係していることが多いという経験上、この線での調査が妥当と判断した。
その結果、こちらの情報に行き着いた。
対応
結論として、環境変数などで以下のようなProxy設定をしている場合でも、REST HelperにProxyの設定が必要ということが分かった。
SET ELECTRON_GET_USE_PROXY=true
SET GLOBAL_AGENT_HTTPS_PROXY=http://PROXY_URL
SET HTTPS_PROXY=http://PROXY_URL
SET HTTP_PROXY=http://PROXY_URL
上記のようにすでにProxyの設定がされている前提で、codecept.conf.js
のREST HelperのonRequestに以下のような記述が必要になる。
REST: {
endpoint: '{REST URL}',
prettyPrintJson: true,
// 追記した設定
onRequest: (request) => {
if (process.env.https_proxy) {
request.proxy = false;
request.httpsAgent = new HttpsProxyAgent(process.env.https_proxy);
}
if (process.env.http_proxy) {
request.proxy = false;
request.httpAgent = new HttpsProxyAgent(process.env.http_proxy);
}
}
// ここまで
},