グアバには膨大な数の単体テストがあります。2012年7月現在、guava-testsパッケージには286,000を超える個別のテストケースが含まれています。これらのほとんどは、手書きではなく自動的に生成されますが、特にcom.google.common.collectの場合、グアバのテスト範囲は非常に徹底しています。
それらはどのように生成されましたか?それらを設計および生成するためにどのような技術と技術が使用されましたか?
グアバには膨大な数の単体テストがあります。2012年7月現在、guava-testsパッケージには286,000を超える個別のテストケースが含まれています。これらのほとんどは、手書きではなく自動的に生成されますが、特にcom.google.common.collectの場合、グアバのテスト範囲は非常に徹底しています。
それらはどのように生成されましたか?それらを設計および生成するためにどのような技術と技術が使用されましたか?
回答:
この大量のテストの大部分は、グアバコレクションの実装用です。彼らは、コレクションインターフェイスを徹底的にテストする汎用テストを作成しました。これにより、実装ごとにスイートが生成されます。たとえば、と呼ばれるクラスのために、参照してくださいCollectionAddAllTester
、ListIndexOfTester
。
これはすべて、testavaと呼ばれるライブラリによってサポートされています。testlibは、Guavaの一部として出荷されます。これは非常に一般的です。コレクションだけでなく、あらゆるインターフェイスの汎用テストの作成をサポートしています。Feature
可能な実装のsを指定し、それらをテストできます(たとえば、セットが変更不可能な場合、異なる結果が期待されますset.add()
)。テストを実行するとき、実装がサポートする機能を指定します。
4ではなくJUnit 3に基づいています。通常、TestCase
という名前のメソッドでいっぱいのクラスがtestSomething()
あり、JUnitはそれらをリフレクションで実行します。testlibライブラリは、これらのテストの実行にフックするため、ライフサイクルは次のようになります。
TestCase
インスタンスをTestSubjectGenerator
-これは、実際にテストサブジェクトを作成する場所を拡張するtestlibインターフェイスですgetSubjectGenerator()
に、被験者にアクセスできるようにします重要なのは、特定のテストサブジェクトを汎用テストケースに挿入できるようにする追加の初期化ステップです。
独自のインターフェース用のスイートを生成するtestlibの書き方に関する投稿を書きました。
(sqaサイトの同じ質問にも投稿されています。)
ユニットテストジェネレーターがあります。たとえば、.NETの世界では、Microsoft Pexのようなものがこれを実行できます。
たとえば、Microsoft Pexは、コード分析に基づいて、メソッドの引数として可能なすべての値を試行します。一部の引数では、メソッドが例外をスローすることが期待されています。そのようなものは、作成されたテストを自動的に実行できます。特定の場合に返される空の文字列のような静的な値も自動的にテストできます。