手元で Firefox をビルドせずに Mochitest を動かす

Mozilla のソースツリーには Firefox 自体のテストを行うツールが色々と埋まってて、その中に Mochitest というものがある。詳しくはリンク先を見てもらった方が速いんだけど、Mochitest では chrome 権限で動くコードを対象に含むテストができる。

で、これは普通は手元で Firefox をビルドしないと使えないんだけど、自前でビルドせずとも Mozillaftp サーバーから、ビルド時に生成されるテストセットを DL して、適切にオプションを設定することで手元でビルドせずに動かせたりする(つまり、Mochitest 自体はビルド処理をかませたものでないと動かないけど、それさえ行ってあればコマンドラインオプションを追加することで動かせる)。

用意するもの

  • 実行環境に応じた firefox-*.tests.zip
    (たとえば最新のNightlyの場合は ftp://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla-central/ から拾ってくる
  • テスト対象の Firefox
    (拾ってきたテスト一式と同じリビジョンから生成されたものを使います。というわけでこれも拾ってきたりする)
  • テストケース
    Mozilla のソースツリーに入ってるものは、拾ってきたテスト一式の中に入ってる)

テスト実行

最初に挙げた Mochitest のドキュメントを読めば基本的には実行できる……はずなんだけど、今回の場合はそれに追加で最低限以下のオプションを付ける必要がある

  • --appname に、実行する Firefox のバイナリのフルパスを指定
  • --utility-path$(TESTS)/bin/ を指定
  • --certificate-path$(TESTS)/certs/ を指定
  • --test-pathMozilla のソースツリー上での位置を指定(実行される実ファイルは$(TESTS) ディレクトリ以下のもの)。

なにがうれしいの

これだけだと自分でビルドせずにパッチを書くような人か Firefox のテストを延々実行して悦びを見出すような変態しか面白くないだけど、オプションでコマンドラインをつけることで

  • 指定したアドオンをインストールした状態でテストを実行できる:
    --install-extension=path/to/<add-on-id>.xpi

  • 指定したプロファイルを使ってテストを実行できる(ただしテスト終了時に選んだプロファイルは削除される):
    --profile-path=path/to/profile/

といった機能を使える(mochitest/runtests.pyを参照)。

というわけで、アドオンのテストなどにも地味に使えるわけです。

アドオンのテストというと、UxUなどがあるわけだけど、Mochitest でテストを行うメリットとしては、Mozillaのソースツリーに埋まっている山のようなテストコード資産を使える(新規にテストを書く際の参考にできる・本体側に余計な影響を及ぼしてないかテストできる)という辺りだと思う。

逆に Mochitest でのアドオンテストのデメリットは、「UxU と違っていちいちテスト環境を用意しないといけない」「そもそも UxU でも相当数のテストケースは書ける(アドオンをインストールせずともテスト実行できる)」という辺り。特に前者が致命的かもしれない。

だいたいこんな感じ。

Marionette とか他のテストツールの使い方? そのうち気が向いたら書くかも。