8

次のテストを含むレガシーJUnitテストスイートがあるとします。

public class AwesomeTest {
     public void testBusinessLogic() {
     ...
     [awesome mocking library]
     ...
     }
}

public class AmazingTest {
    public void testBusinessProcess() {
    ...
    [amazing xml operation]
    ...
    }
}

ここで、AwesomeMockingライブラリがクラスを含むAwesomeBCELバイトコード生成ライブラリに依存しておりorg.useful.XMLClass、このライブラリにバージョン1のXMLClassがあると仮定します。

ここで、AmazingXml操作がクラスを含むAmazingXml Libraryに依存しておりorg.useful.XMLClass、このライブラリにバージョン2のXMLクラスがあると仮定します。

また、クラスのバージョン2はバージョン1と下位互換性がないと仮定します。つまり、クラスパスで優先度が高いバージョンはどれでも、他のバージョンの依存関係を壊します。

また、素晴らしいモックライブラリに依存する400のテストがあると仮定します。したがって、書き換えは望ましいオプションではありません。

また、いくつかの重要なビジネス機能が驚くべきxmlライブラリで構築されていると仮定します。これを書き直さないことを強くお勧めします。

このクラスパスの地獄の状況をどのように解決しますか?2つの異なる手動で順序付けられたクラスパスと手動で決定されたテストサブセットを使用してantテストを2回実行する(Antで実行していると仮定)以外は?(私はカスタムクラスローダーのアイデアを受け入れていますが、それはantソリューションを使用したデュアルカスタムクラスパスとほぼ同じレベルの保守性のようです)

4

2 に答える 2

3

私は、Java エージェントとカスタム クラス ローダーを使用することで、非常に透過的なソリューションが可能であると確信しています。アイデアは次のとおりです。

  1. インストルメンテーション フレームワーク(Java エージェント) を使用して、ロード時にクラスをインターセプトします。Awesome Mocking Library にあるクラスを検出したら、すべての参照org.useful.XMLClassintercepted.org.useful.XMLClass.
  2. リクエストされたクラスがintercepted.org.useful.XMLClass. 存在する場合はXMLClass、モッキング ライブラリで使用されているバージョンをロードします。他のすべてのリクエストは、デフォルトで処理できます。

カスタム クラス ローダーを使用し、テストの実行時に Java エージェントをアタッチすると、依存関係の競合がないかのように、すべてが正しく実行されます。

于 2013-02-28T12:48:00.913 に答える
0

スティーブンの答えは素晴らしいと思います-完全を期すために、そしてこの質問は非常に多くの票を獲得したため-私たちが考えたすべての代替案(悪いものを含む)を共有したかったのです

  1. テスト (またはテストの一部) を別のクラスパス順序に分割します (欠点 - テストに関する他の重要な問題を見逃す可能性があります - 実行可能なオプションではありません)
  2. Amazing xml 操作をロールバックし、別の方法を実装します (これを使用するための投資と、他の操作が使い果たされたという事実を考慮して、これは却下されました)
  3. 新しいモッキング ライブラリを使用してテストを書き直します (これは長期的には有効です。短期的には、現在のプロジェクトよりも大きくなります。何百ものプロジェクトがあるためです)。
  4. の新しいバージョンを使用する驚くべきモッキング ライブラリのカスタマイズされたバージョンを構築しますorg.useful.XMLClass(これは現在のプロジェクトよりも大きいことが判明しました)。
  5. ソースから問題のあるクラスを抽出し、古いバージョンをテスト クラスパスに配置して、ソース ライブラリをオーバーライドします (これは他のいくつかのクラスと絡み合っていることが判明したため、自明ではありませんでした)。
  6. 上記のスティーブンの素晴らしいアイデアを使用してください-これも重要であることが判明しました
  7. テストを @Ignore で設定し、将来のプロジェクトで書き直すためにキューに入れます。
于 2013-03-01T10:19:02.177 に答える