Browser chromeテスト

Browser chromeテストスイートは、JavaScriptを用いてアプリケーションのChromeウィンドウをテストできるように設計された、自動テストフレームワークです。現在の所、JavaScriptのコードをFirefoxのメインのブラウザウィンドウと同じスコープで実行し、結果をMochitestテストフレームワークと同じ関数を使って報告することができます。Browser chromeテストスイートはMochitest frameworkからのruntests.pyに依存しており、Mochitestが無効化されたビルド(--disable-mochitest オプションを付けたビルド)では動作しません。

Browser chromeテストを実行する

Mochitestを実行するには、あなたが行った変更を含めて、まずMozillaをビルドする必要があります。その後、

  • Gecko 1.9.1 およびそれ以降(バグ 417516 が修正されて以降)では、以下のコマンドを最上位のディレクトリで実行してください:
    • make -C $(OBJDIR) mochitest-browser-chrome
  • 古いブランチでテストを実行するには、Mochitest の runtests.py スクリプトをコマンドライン引数 --browser-chrome を付けて実行してください:
    • cd $(OBJDIR)/_tests/testing/mochitest
      python runtests.py --browser-chrome

このコマンドは、あなたがビルドしたMozillaを起動した上で、「browser chrome tests」というウィンドウを開きます。「run all tests」ボタンをクリックするとテストの実行が開始され、実行結果はそのウィンドウ内と標準出力に報告されます。結果をファイルに出力するためのオプションも利用可能です。その場合は上記のコマンドに加えて、Mochitestで使用されるのと同じパラメータ(--log-file=/path/to/file)を指定してください。

テストハーネス【訳注: テスト実行用プログラム】に対して、ユーザの手動操作無しで起動時にテストを自動実行するよう指示するには、runtest.pyのパラメータとして --autorun オプションを指定します。テストを完全に自動化するために、このオプションと同時に --close-when-done オプションを指定する事もできます。

browser chrome テストスイートは、特定のグループのテストの実行順序を指定するために、--test-path オプションを受け付けます。Mochitest と同様に、--test-path オプションで指定されるパスは Mozilla のソースツリーにおけるテストファイルまたはディレクトリへのパスです。パスがディレクトリを指している場合は、そのディレクトリとサブディレクトリに含まれるすべてのテストが実行されるでしょう。

例えば、browser/base/content/test のテストを実行するコマンドは以下のようになります:

TEST_PATH=browser/base/content/test/ make -C $(OBJDIR) mochitest-browser-chrome

Browser chromeテストを書く

Browser chromeテストはブラウザウィンドウのグローバルな変数スコープで実行されるJavaScriptのコード片です。単純なテストの例はこのようになります:

 function test() {
   ok(gBrowser, "gBrowser exists");
   is(gBrowser, getBrowser(), "gBrowser and getBrowser() are the same");
 }

「test」関数は、テストが実行される時にテストハーネスによって呼び出されます。テストのファイルには他の関数を含める事ができますが、それらはtest()によって呼び出される物以外は無視されます。

注意: 関数や変数に名前を付ける時には注意してください。テストファイルの内容はブラウザウィンドウと同じスコープで実行されるため、変数名が衝突すると、テストの実行時に問題が起こる可能性があります。テスト用のコードによる副作用をなるべく少なくすると同時に、他のテストに影響を与えないために、テストの実行が終わった後は「クリーンアップ」を自ら行うようにしてください。

比較関数はMochitestsでサポートされているものと全く同じ物を使えます。詳細を知りたい場合は、Mochitestのドキュメントの比較関数がどのように動作するかを参照してください。 グローバルのスコープに定義された「EventUtils」オブジェクトから、EventUtilsヘルパ関数 を利用する事もできます。

テストスイートでは、Mochitestで用意されている関数と同じ名前の関数を使う事で、非同期のテストも実行することができます。test()の実行が終わるまで待ってから実行結果の報告を受け取りたい場合、test()の中でwaitForExplicitFinish()を呼んでください。テストが完了した後にはfinish()を呼びます。テストが完了するまであまりに長い時間がかかった場合、テストハーネスはそのテストをFAILED(失敗)と見なす事に留意してください(現在の所、タイムアウトまでの時間は30秒です)。

 function test() {
   waitForExplicitFinish();
   setTimeout(completeTest, 1000);
 }
 
 function completeTest() {
   ok(true, "Timeout ran");
   finish();
 }

もしあなたのテストがランダムにタイムアウトした時、それが処理に時間がかかりすぎるせいで起こっていると考えるならば、タイムアウトまでの時間を延ばす事ができます。これは完全な解決ではなく、あなたはなぜそのテストに長い時間がかかっているのか(テストの設計が良くないせいだったり、パフォーマンス上の問題があるせいだったりはしないか)を調査することが望ましいという事に気をつけて下さい。 本当にタイムアウトの時間を延ばす前に、もしテストをもっと短く書く事ができるようであれば、もっと小さいテストに分割したり、あるいは、なぜ長い時間がかかっているのか原因を調べたりといった対策を取るべきです!

 function test() {
   // requestLongerTimeout は既定のタイムアウト秒数の30秒を何倍するかを整数で受け取ります。
   // 2であれば「合計で60秒(2×30秒)待つ」という事になります。
   requestLongerTimeout(2);
   waitForExplicitFinish();
   
   setTimeout(completeTest, 40000);
 }
 
 function completeTest() {
   ok(true, "Timeout did not ran");
   finish();
 }

test()内で投げられたあらゆる例外は、捕捉され、テストにおいて失敗として報告されます。test()の外で投げられた例外(タイムアウトした場合、イベントハンドラ内での例外など)は捕捉されませんが、タイムアウトしたテストについては、それらがfinish()の実行を妨げた場合は実行結果において報告されます。

テストファイルの名前は「browser_」で始まり、拡張子は「.js」でなければなりません。このパターンに一致しないファイルはテストハーネスによって無視されます。単にバグ番号だけを使うよりも、より問題の内容を読み取りやすいファイル名にすることが、強く推奨されます。

あなたは、各テストで共通のユーティリティやヘルパーを head.js というファイル(このファイルは browser-chrome テストと同じフォルダに置かれなければなりません)にまとめる事ができます。このファイルの内容は、同じフォルダに存在する各テストに対して、テストのスコープに注入されることになります。head.js のメインのスコープでのあらゆる関数呼び出しは、メインの test() が実行されるよりも前に行われる事に注意してください。

テストを実行し終えた後に何らかの特別なクリーンアップ処理を行う必要がある場合は、テストが完了した後に必ず呼ばれる、クリーンアップ用の関数を登録する事ができます。あなたは registerCleanupFunction() をテストの中の任意の時点で(そのフォルダの中のすべてのテストに対してクリーンアップ用の関数を登録する必要があるのなら、head.js の中でも)呼ぶ事ができます。クリーンアップ用の関数は必要なだけ任意の個数登録できることに注意してください。クリーンアップ用関数はまた、テストがタイムアウトした時にも必ず呼ばれますので、次に実行されるテストを汚染してそれらが失敗してしまうといった事が起こらないように強制する事ができます。

新しいBrowser chromeテストをツリーに追加する

新しいBrowser chromeテストをツリーに追加するには、Browser chromeテストが _tests/testing/mochitest/mochitest/tests ではなく _tests/testing/mochitest/browser にコピーされるようにするということに留意しながら、Mochitestの説明に従ってください。インストールされるテストのリストのための変数名としては、_TEST_FILESよりも_BROWSER_TEST_FILESを使うことが推奨されます。また、テストファイルの名前は browser chrome テストである事が分かるように "browser_" で始まるようにしなければならない事も憶えておいて下さい。

Document Tags and Contributors

Contributors to this page: Piro
最終更新者: Piro,