0

次の 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 と同様に、すべての潜在的な使用法をテストすることは容易ではありません。さらに、これらのテストでは、バグに依存する誤った使用法を特定することはできません。

したがって、私の考えは、次の方法で進めることです。

  1. このメソッドのすべての呼び出しを検索し (Eclipse で「呼び出し階層」を使用するように)、 のすべての値を抽出しますexpression

  2. (データベースなどから)の実際の値を十分にサンプリングdataし、元のバージョンの を使用して、最初のステップからすべての式を相互評価しますMyClass.methodA(String,String)。トリプル(data, expression, result)をファイルに保存します。

  3. バグ修正を実装。

  4. 上記のファイルを使用してメソッドをテストMyClass.methodA(String,String)し、結果が変わっていないことを確認します。

次の質問:

このアプローチについてどう思いますか?

Eclipseで呼び出し階層を使用すると、呼び出し元のメソッドのみをコピーして貼り付けることができますが、クリップボードへの引数を含む正確な呼び出しはできません(ステップ1を参照)。見つかったメソッドごとに呼び出しを手動でコピーする必要があります。便利な方法で呼び出しを抽出するにはどうすればよいですか (完全な Eclipse ワークスペースで、したがっていくつかのプロジェクトで)。

IMHO私は1つの方法のみをテストしているため、テストは1つのユニットのみをカバーしています。ステップ 4 で JUnit を使用しても問題ありませんか、それとももっと洗練されたものがありますか?

4

1 に答える 1

0

ソフトウェアをテストすることで期待される付加価値は、ほとんどの状況を最小のコストと最大の結果でカバーすることであるため、私はあなたのアプローチに同意します。

ソフトウェアから実際のサンプル値を収集し、それらを代表的なファイルに保存することは、実現するのにそれほど複雑ではなく、このことを分析するための最良の方法であると私には思えます。手動でコピーする必要がある場合でも。

于 2012-07-26T10:10:20.567 に答える