2009-06-06 1 views
4

ほとんどの最新バージョンのコントロールツールには、履歴のバイナリ検索(バイセクト)によってバグを導入した変更を見つけるコマンドがあります。このようなコマンドは組み込みのものでも、拡張機能やプラグインとして提供されるものでもよい。例としてはGitのgit-bisect、Mercurialの「hg bisect」(拡張子はhbisect)、Bazaarのプラグインはbzr-bisectです。改訂履歴とテスト可能でないコミット(リビジョン)をバイセックス(検索)することでバグを見つける

非線形履歴(分岐点とマージ)が存在する場合でも、自動または半自動の方法で行うことが課題です。目標は、一般的に、最小限のステップで「悪い」リビジョンを見つけることです。テストを行うコミットを見つけるために、より詳細に、可能であればコミットのグラフをテスト(コミットのDAG)を半分に分けます。この問題は解決されたと私は思う。

しかし、のテストできないコミットに問題があります。いくつかのリビジョンコードがコンパイルされていない場合、またはコンパイルされた場合、それは開始/実行されません(または、検索しているものと無関係のバグを見つける)。バギー行動 - バグが

  • 悪い存在していない -

    • 良い:これは代わりに、単純に「良い」または「悪い」としてコミットマーキングの、あなたが今可能な状態を持っていることを意味し
    • 不明テスト不能は) - バグが存在する場合は知られていない

    一部のバージョン管理システム(SCM)では、このようなコミットを「スキップ」することができます。通常は、親のリビジョンに次にテストするものとなります。


    質問は以下のとおりです。

    • あなたはこのような状況に対処する場合は、二分を使用し、非テスト可能改定つまずい意味、あなたの経験では、このような非検証可能なコミットの分布は何ですか?それらは孤立して(単一のun-testableコミット)発生するか、範囲内に現れますか(リビジョンa..bはテスト不能です)?あなたはコミット後にコミットをスキップしなければならない状況に自分自身を見つけましたか?

    • リスト/線形履歴を単純に二等分する場合や、リビジョンの任意のDAGを二等分する場合など、いくつかのマテリアルモデルがあるか、テスト可能でないコミットをスキップするのを最適化するアルゴリズム(おそらくヒューリスティック)があります。目標は、テストできないコミット(または無関係のバグ)が存在する場合に、テストするバージョンの数を(平均で)最小にすることです。

    • バージョン管理システム、またはリビジョン管理システム用のアドオン/拡張/プラグイン、またはそのようなアルゴリズムを実装するサードパーティのツールを使用しますか?隣に移動することでテストできないコミットを単にスキップすることができますリビジョン?このVCSまたはツールとは何ですか?あなたがそれを知っているなら、どのアルゴリズムを使用していますか?

    これにより、さらに簡単に(半自動的に)バグを発見することができます。


    を追加しました2009年6月6日:
    Gitリポジトリの高度な機能を使用して、あなたがテストに少なくともハードテスト不能コミットの(または全体を支店を持つことができるものな状況があります)、つまり「サブツリー」を使用して、2つの別々のプロジェクト(例えば、完全なLinuxカーネル、「サブツリー」マージを使用して別々に開発されたドライバーを含む)の履歴を結合します。これは、テスト可能でないコミットに対処するためのアルゴリズムを考案する際に考慮すべき点です。非線形履歴では、テストできないコミットの全体が存在する可能性があり、アルゴリズムはトポロジ(幾分)を考慮する必要があります。

  • 答えて

    0

    バイセクション/バイナリ検索アルゴリズムの個々の要素を、単一のリビジョンではなく隣接する「不明な」状態のリビジョンの範囲に再定義することができます。

    つまり、バイナリ検索中に不明な状態が見つかった場合は、順方向と逆方向のサブ検索を開始して、明確な回答が得られるリビジョン範囲の境界を見つけます。これはおそらく両方向の線形検索なので、少し遅くなりますが、ほとんどのリビジョンはテスト可能ではないと仮定しなければなりません。

    これは最終的には、バグがどこに現れたかをリビジョン(58,63)のどこかに出力します。この範囲を手動で検索する必要があります。

    3

    何がチェックインされているのか、明らかに助けにはなりません。私が作業した大規模なコードベースでは、すべてのチェックインが実際にビルドされる必要がありました。これは、開発者に変更をサブミットして、チェックインサーバーに入り、変更待ち行列に入ることを待っていました。各変更は、すべてのターゲットプラットフォームに対して、送信された順序で作成されます。ビルドに失敗すると、チェックインは拒否されます。成功した場合は、一連の自動回帰/単体テストが実行されます。いずれかのテストが失敗した場合、チェックインは拒否されます。チェックインが成功すると、チェックインはリポジトリにコミットされます。

    このようなシステムを使用している場合は、未構築/未テストのリビジョン数が大幅に減少します。悪いビルドは、デポ管理者がチェックインサーバーの外に変なことをすることに限られます。

    このようなオプションが存在しない環境では、統計的な分析はありませんが、私はポケットには奇妙なことにビルド不可能なリビジョンが存在することがわかりました。 1回のチェックインで1トンのものが混乱し、その後、混乱を修正しようとする一連の小さなチェックインがあります。しばらくの間、物事は一般的にうまくいきます。

    +0

    あなたのアドバイスは、テストできないコミットを導入することです。良いアドバイスですが、大したことはありません(サブツリーマージに関するコメントも参照してください)。 –

    +0

    悪いコミットのようなポケットの長さの分布を知っているといいでしょう。 –

    0

    ちょっとしたアイデア:ノイズの存在下でテストすることを考えている他の問題の1つを知っています。スキップを考える方法の1つは、それらをランダムに良/不良に対応するものとして扱い、そのようなエラーに堅牢な二分アルゴリズムを使用することです。 http://www.disp.uniroma2.it/users/grandoni/FGItcs.pdf "メモリフォールトがあると最適なソーティングと検索" I.Finocchi、F.Ganononi、およびG.F.Entryo。

    このアルゴリズムをgit-bisectに適用すると、スキップポイントから離れることになり、間違った分岐が続いたことが発見されたときに検索を再実行することになります。上記の論文とは異なり、を知っていますが、その点は信頼できないので、バックトラックすることができます。

    +0

    これは、断続的な障害の存在下で二等分するというより困難な問題を解決しようとしているように見えます。とにかくピンターに感謝します。 –

    +1

    私はその論文だけをスキャンしましたが、私はそれが部分的な注文ではなく総注文の場合に限定されていると言うことができるので、DAGではなく線形履歴に役立ちます。 私はノイズの存在下で動作するバイセクトの実装を持っています(http://github.com/Ealdwulf/bbchop/tree/master)。 知られているスキップを与えられたスキップの確率分布を仮定し、スキップされない確率で期待される情報ゲインに重み付けをすることによって、スキップケースにそれを拡張するのは容易でした。しかし、私はかなり単純な確率分布の2つしか実装していませんが、それ以上のプラグインは簡単です – Ealdwulf

    関連する問題