6

注釈からいくつかの標準単体テストの生成をサポートするフレームワークはありますか? 私が考えていることの例は次のとおりです。

@HasPublicDefaultConstructor
public class Foo {

}

これは明らかに、Foo にデフォルトのコンストラクターがあるかどうかをチェックする単体テストを自動的に生成するために使用されます。そんなことを考えたのは私だけでしょうか。;) 私は Java に最も興味がありますが、他の言語でのソリューションも確かに興味深いものです。

編集:S.Lottの答えに応えて、明確にさせてください:

クラスにデフォルトのコンストラクターがあるかどうかをテストしようとしています。(もちろん、これは単なる例です。) テストを書くことでそれを行うこともできますが、それは非常に面倒です。そこで、コンパイル時に (APT を介して) 注釈を処理し、テストを生成するツールを探しています。そのようなものは存在しますか?そうでない場合、それは良い考えだと思いますか?

4

11 に答える 11

7

問題は、追加の注釈の形で単体テスト情報を使用して製品コードを「汚染」することが本当に良い考えかどうかです。個人的には反対票を投じたい。

于 2008-12-28T19:18:56.950 に答える
2

tl;dr:代わりにコード検査ツールを使用してください。それらはあなたが望むことを行うことができ、コードを汚染せず、自動ビルド プロセスに簡単に組み込むことができます。

これは、単体テストで処理する必要があるようには思えません。すべてのクラスに既定のコンストラクターを定義する必要があると断言する場合は、静的コード アナライザーを使用することをお勧めします。 PMDには、この種の検出器が間違いなくあります。この種の検出器をCheckstyleで強制することもできます。

どちらも簡単にカスタマイズでき、単体テストと並行して継続的インテグレーション プロセスの一部にすることができます。

最も重要なポイント:これにより、追加の注釈でコード ベースを汚染することなく、必要な機能を実装できます。これは、私がこのアイデアを検討する際の主なつまずきポイントです。ソフトウェア管理に大きな問題が生じたのです。

デフォルトのコンストラクターを持つクラスを不変に変更する状況を想像してみてください (したがって、構築中にオブジェクトを完全に設定する必要があります)。そのクラスのすべての注釈を更新することを覚えていましたか? このクラスのメソッドを呼び出す他のクラスの関連するアノテーションを変更したことを覚えていますか? などなど。

于 2009-05-18T13:27:01.740 に答える
2

標準の Java よりも宣言的な表現力を備えたプログラミング言語を探しているようですね。仮定するテストは、コンパイラが宣言のセマンティクスをチェックできるようになるまで、ギャップを埋めます。

あなたが提案する種類の注釈から自動テストに変換するツールを知りません。ただし、特に最近の (-ish) コンパイラ API では、TDD の優れた演習のように思えます。

于 2008-12-29T21:27:53.647 に答える
1

「注釈を処理して...そして私のためにテストを生成する」

限られた数のケースでは、これが機能するようになる可能性があります。ただし、一般的には機能しません。

@StandardTestForClassHierarchy1
@StandardTestForClassHierarchy2
@StandardTestForClassHierarchy3
@StandardTestForSomeOtherFeature4
@AspectFeature5
@AspectFeature6
@HasPublicDefaultConstructor
@AspectX
@AspectY
class SomeClass extends SomeClassHierarchy implements SomeOtherFeature {
}

単体テストのアノテーションと実際のアノテーションを区別できません。

テストアノテーションは、アプリケーションの実行時の動作を説明していますか?

  • それら実行時の動作を記述している場合、それらは実際のAOPアノテーションであり、テストの記述ではなく、実行時コードを実際に生成する実際のアノテーションです。また、アノテーションには、モッククラスに対する独自のテストがあります。

  • アノテーションが実行時の動作を説明していない場合、私は今、この奇妙な非機能的および機能的なアノテーションの乱雑さを持っています。機能しないアノテーションに値が表示されません。

于 2008-12-29T17:24:59.207 に答える
1

Agitar には、JUnit テストを生成する [商用]製品AgitarOneがあります。現在注釈をサポートしているかどうかはわかりませんが、2005 年にはサポートしていませんでした。

Jtest はもう1 つの Java 指向の単体テスト ジェネレーターであり、Parasoft はC++単体テストを生成するための C ++Testも提供しています。

私はそれらをテストしたことはありません。数年前に C++Test の論文を読みましたが、納得できませんでした。

于 2008-12-28T19:04:02.753 に答える
1

デフォルトのコンストラクターの存在をテストするために説明したものと多少似ていますが、私はTestUtilを使用してゲッターとセッターを自動的にテストしました。XML ファイルまたは JavaDoc タグを使用して、テスト オプションを微調整できます。残念ながら、現在、注釈のオプションはないようです。

于 2008-12-28T21:08:37.353 に答える
0

特定の例では、Java APT (コンパイル時の注釈処理) を使用して、コンパイル時にそのような問題をはるかに早く検出する方がよい場合があります。

于 2008-12-28T17:05:11.713 に答える
0

あなたが自分自身を救う可能性は低いと思います。ただし、複雑さが増します。

デフォルトのコンストラクターがあることを確認したい場合は、単体テストに以下を追加します。

Foo foo = new Foo();
于 2009-05-18T18:52:01.350 に答える
0

これはあなたが探しているものかもしれません: http://developer.spikesource.com/wiki/index.php/Projects:testgen4j . その他の役立つリンク: http://www.opensourcetesting.org/unit_java.php。ここに最新の論文があります: http://www.alexquinn.org/papers/Generating%20Java%20unit%20tests%20with%20AI%20planning%20(2007).pdf

于 2008-12-28T16:25:36.487 に答える
0

EiffelStudio CDD には興味深いアプローチがあります。デバッグ モードで実行している間、IDE は呼び出されているメソッドに関する情報を収集し、コンテキストと呼び出しを単体テストに入れます。障害は、Design by Contract を使用して検出されます。Javaの上に契約拡張機能による設計があることは知っているので、これは良い方法かもしれません。

于 2008-12-28T16:41:15.287 に答える
0

これは、APT を使用してコンパイル時に検出できます。

http://www.javaspecialists.eu/archive/Issue167.html

于 2008-12-30T17:40:22.403 に答える