web-dev-qa-db-ja.com

Guavaユニットテストはどのように自動的に生成されますか?

グアバにはユニットテストケースがあります 自動生成

グアバには驚異的な数のユニットテストがあります。2012年7月の時点で、グアバテストパッケージには286,000を超える個別のテストケースが含まれています。これらのほとんどは自動的に生成され、手書きではありませんが、Guavaのテストカバレッジは特にcom.google.common.collectに対して非常に完全です。

それらはどのように生成されましたか?それらを設計および生成するために使用された技術と技術は何ですか?

31
dzieciou

この大量のテストの大部分は、Guavaコレクションの実装用です。彼らは、コレクションインターフェイスを徹底的にテストする一般的なテストを作成しました。これにより、実装ごとにスイートが生成されます。たとえば、CollectionAddAllTesterListIndexOfTesterというクラスを参照してください。

これはすべて、グアバの一部として出荷されるtestlibと呼ばれるライブラリによってサポートされています。これは非常に一般的です。 (単なるコレクションではなく)あらゆるインターフェースの一般的なテストの作成をサポートします。可能な実装のFeaturesを指定してそれらをテストできます(たとえば、セットが変更不可の場合、set.add()からの異なる結果が予想されます)。テストを実行するときに、実装がサポートする機能を指定します。

それは4ではなくJUnit 3に基づいています。通常、TestCaseを拡張するクラスがあり、testSomething()という名前のメソッドがいっぱいあり、JUnitはそれらをリフレクト的に実行します。 testlibライブラリはこれらのテストの実行にフックするため、ライフサイクルは次のようになります。

  • テストする実装ごとに
  • (該当する)テスト方法ごと
  • TestCaseインスタンスを作成する
  • TestSubjectGeneratorを初期化します–これは、実際にテストサブジェクトを作成する場所を拡張するtestlibインターフェイスです
  • 反射的にテストメソッドを実行します。このメソッドの間、getSubjectGenerator()はテスト対象へのアクセスを提供します

重要なビットは、特定のテスト対象を一般的なテストケースに挿入できるようにする追加の初期化ステップです。

I 投稿を書いた 独自のインターフェース用のtestlib生成スイートの書き方について。

sqa サイトの同じ質問にも投稿されています。)

8
Joe Kearney

ユニットテストジェネレーターがあります。たとえば、.NETの世界では、Microsoft Pexのようなものがこれを行うことができます。

たとえば、Microsoft Pexは、コード分析に基づいて、メソッドの引数としてすべての可能な値を試みます。一部の引数は、メソッドが例外をスローすることが期待されています。そのようなものは自動的に作成されたテストをすることができます。特定の場合に返される空の文字列などの静的な値も自動的にテストできます。

6
Sebazzz