次の Java クラスを想定します。
class MyClass {
public String methodA( String data, String expression ) {
// expression is evaluated using data
// ...
// this leads to a result which is returned
return result;
}
}
expression
これは式言語 (DSL) のインスタンスであることに注意してください。したがって、expression
使用の評価はdata
、両方の組み合わせによって異なります。通常、は頻繁には変更されず、すべての呼び出しで変更される可能性expression
がある固定値です。data
さて、しばらくして にバグが見つかりましたMyClass.methodA(String,String)
。このバグは、いくつかの基になるクラスに存在し、 と の特別な組み合わせでのみ発生しexpression
ますdata
。JUnit テストは、この特殊なケース用に簡単に記述でき、修正することができます。
残念ながら、この方法はプロジェクト全体で頻繁に使用されます。Eclipse 呼び出し階層は、このメソッドが使用されている 97 を超える他のメソッドを識別します。バグ修正を適用しただけでは、リグレッションが怖いです。より安全に感じるために、いくつかの回帰テストを行いたいと思います。
通常、単体テストでは、すべての重要な種類の呼び出し、特にボーダー ケースを考慮する必要があります。しかし、expression
大きく変化する可能性のある DSL と同様に、すべての潜在的な使用法をテストすることは容易ではありません。さらに、これらのテストでは、バグに依存する誤った使用法を特定することはできません。
したがって、私の考えは、次の方法で進めることです。
このメソッドのすべての呼び出しを検索し (Eclipse で「呼び出し階層」を使用するように)、 のすべての値を抽出します
expression
。(データベースなどから)の実際の値を十分にサンプリング
data
し、元のバージョンの を使用して、最初のステップからすべての式を相互評価しますMyClass.methodA(String,String)
。トリプル(data, expression, result)
をファイルに保存します。バグ修正を実装。
上記のファイルを使用してメソッドをテスト
MyClass.methodA(String,String)
し、結果が変わっていないことを確認します。
次の質問:
このアプローチについてどう思いますか?
Eclipseで呼び出し階層を使用すると、呼び出し元のメソッドのみをコピーして貼り付けることができますが、クリップボードへの引数を含む正確な呼び出しはできません(ステップ1を参照)。見つかったメソッドごとに呼び出しを手動でコピーする必要があります。便利な方法で呼び出しを抽出するにはどうすればよいですか (完全な Eclipse ワークスペースで、したがっていくつかのプロジェクトで)。
IMHO私は1つの方法のみをテストしているため、テストは1つのユニットのみをカバーしています。ステップ 4 で JUnit を使用しても問題ありませんか、それとももっと洗練されたものがありますか?