Skip to content

問題の最小の再現条件を突き止める手順

YUKI "Piro" Hiroshi edited this page May 2, 2021 · 4 revisions

イシュートラッカーに報告をする前に、あなたが遭遇した問題の最小の再現条件を突き止めておいてください。「タブが復元されない」ということしか書かれていないような、情報が少なすぎる報告は、問題解決の助けにならないばかりか、関わる人達の調査に要する時間を無駄に消費することにもなり得ます。

Firefox 76以降のバージョンであれば、普段使いのFirefoxとは別の場所にFirefoxをインストールすることで、普段使いの環境を壊すことなく安全に、初期設定の状態の環境を用意することができます。ただ、そこから何のヒントも無しに最小の条件を突き止めるのは難しい場合があります。

このページでは、私(TSTの元々の作者)が普段問題に遭遇した時にどのように調査をしているかを説明します。


ものすごく単純に言うと、手順は以下の2段階です。

  1. 普段使いの環境に影響しない、テスト用の環境を用意する。
  2. プロファイルの内容を二分探索する。

以下、詳細を説明します。

テスト用の環境を用意する

  1. 新しい空のプロファイルを用意します。Firefox 76以降のバージョンを、普段使いのインストール先とは別のインストール先にインストール済みと仮定します。例えば、普段使いの環境は C:\Program Files\Mozilla Firefox で、テスト用環境は C:\Program Files\Mozilla Firefox Debug とします。これらを「普段使いのFirefox」と「デバッグ用Firefox」と呼び分けることにします。
  2. デバッグ用プロファイルフォルダーを開きます。デバッグ用のFirefoxを起動し、about:support (ヘルプ→トラブルシューティング情報)を開いて、「プロファイルフォルダー」という見出しの行の「フォルダーを開く」ボタンをクリックしてから、Firefoxを終了します。
  3. この段階で、一つフォルダーが開かれているはずです。これを「デバッグ用プロファイル」と呼ぶ事にします。
  4. デバッグ用プロファイルの全ファイルを削除します。
  5. 普段使いのプロファイルフォルダーを開きます。普段使いのFirefoxを起動し、about:support (ヘルプ→トラブルシューティング情報)を開いて、「プロファイルフォルダー」という見出しの行の「フォルダーを開く」ボタンをクリックしてから、Firefoxを終了します。
  6. この段階で、一つフォルダーが開かれているはずです。これを「普段使いのプロファイル」と呼ぶ事にします。

この時点で、あなたの目の前には2つのプロファイルがあるはずです。

  • 普段使いのプロファイル
  • デバッグ用プロファイル(空のプロファイル)

これで、デバッグ用プロファイルを使った二分探索の準備が整いました。

プロファイルの内容を二分探索する

二分探索は、「容疑者リスト」の中から「真犯人」を見つけるためのよく知られた方法です。二分探索の基本的な考え方は以下の通りです:

  1. 容疑者をAとBの2つのグループに分けます。Aは容疑者の半分、Bは残りの半分です。
  2. AかBのどちらかを取り除きます。ここではAを取り除いたと仮定します。
  3. 問題の再現を試みます。
  4. 問題は無事に再現しましたか?
    • 「再現した」ということであれば、真犯人は残った容疑者(B)の中にいます。BをさらにA2とB2の2グループに分けて、手順2に戻ります。
    • 「再現しなかった」ということであれば、真犯人は先ほど取り除いた容疑者(A)の中にいます。Aを元に戻した上で、Bを取り除き、さらにAをA2とB2の2グループに分けて、手順2に戻ります。
  5. 手順2から4を、容疑者が1つだけもしくはごく少数に絞られるまで繰り返します。
  6. 最後の容疑者1つ、もしくは複数の容疑者全員が残っているときにだけ、問題が無事に再現し、最後の容疑者、もしくは複数の容疑者の中のどの1つでも欠けると問題が再現しない、という状態になった事を確認します。おめでとうございます、あなたはついに真犯人を特定しました!

この手順を、あなたのFirefoxプロファイルから真犯人を捜す方法として援用しましょう。容疑者が多すぎるので、容疑者リストの絞り込みは複数の段階に分けて行わないといけません。例えば以下の要領です。

  1. プロファイル内のファイルとフォルダーの中から、犯人のファイルを特定する。

    1. デバッグ用プロファイルからすべてのファイルを削除し、問題が再現しなくなったことを確認します。
    2. 普段使いのプロファイルから、prefs.jsと、それ以外のファイルのうち版分をデバッグ用プロファイルにコピーして、二分探索を始めます。
    3. ファイルをコピーおよび削除しながら二分探索を繰り返します。
      • 二分探索の各段階において、問題の再現試験を行う前に、毎回デバッグ用プロファイルからすべてのファイルを削除し、prefs.jsと他の容疑者を普段使いのプロファイルからコピーしてくることをおすすめします。
      • prefs.jsは常に普段使いのプロファイルからコピーしてくるのが望ましい、という事を常に意識してください。このファイルには、登録済みアドオンに関する重要な情報が含まれているからです。
    4. 最終的には、ファイルをいくつかの最重要容疑者だけに絞り込めるはずです。

    大抵は、以下のファイルが最重要容疑者として残ることが多いです。

    • extensions (フォルダー):アドオンのパッケージを含んでいます。
    • prefs.js: Firefox自身の設定を含んでいます。
    • storage (フォルダー): アドオンの設定を含んでいます。

    なので私(このアドオンの作者)は通常は、この段階での動作検証を省略して、いきなり上記のファイルだけを残した状態にして、次の段階から二分探索を始める事が多いです。

  2. 容疑者の中に複数のアドオンがある場合、真犯人のアドオンを特定するために二分探索を行う。

    1. すべてのアドオンを無効化し、問題が再現しないことを確認します。
    2. アドオンの半数を有効化し、二分探索を開始します。
    3. アドオンの有効・無効を切り替えながら二分探索を繰り返します。
    4. 最終的には、アドオンをいくつかの最重要容疑者だけに絞り込めるはずです。
  3. 容疑者の中にprefs.jsがある場合、真犯人を特定するために、その内容について二分探索を行う。(このファイルはプレーンテキスト形式ですが、文字エンコーディングや改行コードが変わると正常に動かなくなるので、Visual Studio Codeのようにプログラマー向けのテキストエディターを使うことをおすすめします。)

    1. prefs.jsの全行を削除し、問題が再現しないことを確認します。
    2. 以下の4行と、それ以外の行の中から半分を、普段使いのプロファイルのprefs.jsからコピーしてきて、二分探索を始めます。
      user_pref("extensions.lastAppBuildId", "...");
      user_pref("extensions.lastAppVersion", "...");
      user_pref("extensions.lastPlatformVersion", "...");
      user_pref("extensions.webextensions.uuids", "...");
    3. 行のコピーと削除を繰り返しながら、二分探索を始めます。
      • 二分探索の各段階において、問題の再現試験を行う前に、毎回prefs.jsの全行を削除して、普段使いのプロファイルから設定行をコピーしてくることをおすすめします。
      • 上記の4行は常に普段使いのプロファイルからコピーしてくるのが望ましい、という事を常に意識してください。これらの行を削除すると、アドオンの登録情報が自動的にまっさらに消去されて、問題が意図せず解消されてしまうことがあります。
    4. 最終的には、設定行をいくつかの最重要容疑者だけに絞り込めるはずです。

問題を100%の確立で再現できる最小の再現条件は、開発者が問題の原因を調査し修正するための、非常に重要な助けとなります。もしデバッグ用プロファイルに、Cookie、パスワード、ブックマークなどのプライバシーに関わるデータが含まれていないのであれば、デバッグ用プロファイル自体を圧縮して開発者に送ると、より少ない手間で迅速に問題を解決できるかもしれません。