E2Eのテストを走らせて手元だと通るけど、CIだと通らない、みたいなことがあって、原因を調べたら、cookieまわりが原因だった。
cookie や LocalStorage を利用しているアプリで、事前に「ページのcookieが発行されているか」「LocalStorageにデータが書き込まれているか」どうかで、テストが通ったり通らなかったりするのは避けたい。
一回のテストの実行でみたとき、クリーンな状態のブラウザでテストを実行するには、ブラウザをプライバシーモード(Chromeでいうシークレットモード)で起動するのが、ひとつの手だと思った。 こうすれば、ブラウザ起動時から終了までに発行されたcookieやLocalStorageに書き込まれたデータを消去することができる。
Chromeでは--incognito
というオプションをつけることで、シークレットモードで起動することができる。Protractorの設定では以下のようになる。
exports.config = { capabilities: { 'browserName': 'chrome', 'chromeOptions': { 'args': ['--incognito'] } } }
一方、1つのテストケースやその集まりでみたときは、テスティングフレームワークが用意してくれているフック関数(ex: JasmineでいうafterEach
)で後始末をおこなう。
executeScript
を使うのが少し泥臭いかんじもするが、LocalStorageのデータの消去はProtractorを使っている場合、以下のようになる。
afterEach(function () { browser.executeScript('window.localStorage.clear();') });
cookieの場合はProtractorが削除用のAPIを用意してくれているので楽ができる。
afterEach(function () { browser.manage().deleteAllCookies(); });
もし、このようなAPIが用意されていない場合には(面倒だが)Cookieの有効期限を過去に設定するようなヘルパー関数を用意して呼び出すかんじになるだろう。
おわり