ProtractorでE2Eテストを実行するときのクリーンな状態の準備と後始末について

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の有効期限を過去に設定するようなヘルパー関数を用意して呼び出すかんじになるだろう。

おわり