2012-03-13 9 views
2

私は一連のレガシーユニットテストを行っていますが、そのほとんどはSpring AbstractTransactionalJUnit4SpringContextTestsテストですが、一部は独自のトランザクションを管理しています。残念ながら、これは、テストデータセットを変更するときに完全に無関係なテストを失敗させる副作用をもたらしたと思われます。つまり、失敗したテストはそれ自身で(同じ初期データセットで)実行すると動作します。完全な一連のテストの一部。Junitテストの副作用を自動的に判断する

通常、テストは通常​​のMavenビルド中にMavenのsurefireプラグインを使用して実行されます。

私が探しているのは、実行されたテストの量と順序を並べ替えて原因を突き止める自動化された方法です。素朴ではあるがかなり高価なアプローチは、すべてのテストのパワーセットを取り、すべての可能な組み合わせを実行します。より最適化されたアプローチでは、既存のテスト実行順序(ほとんどがランダムですが安定しています)を使用して、すべての潜在的な順序付きサブセットをテストします。私は、このプロセスの実行時間が長くなる可能性があることを認識しています。

これをそのまま実行できるツール/ Mavenプラグインはありますか?

+0

あなたの質問に答えることはできませんが、Spring管理のトランザクションとロールバック(あなたの状況では失敗します)に頼る代わりに、各テストの前にデータベース全体を単純に再作成することを検討してください。私の[記事](http://nurkiewicz.blogspot.com/2011/11/spring-pitfalls-transactional-tests.html)をご覧ください。 –

+0

Tomasz Nurkiewicz:それは私が最初から始めるときにやることです。残念ながら、すべての必要なデータを読み込むには20秒かかりますが、このアプローチは除外されています(単体テストはあまりデータに頼るべきではないことがわかりますが、従来のコードで作業する場合、 –

答えて

1

私はあなたが欲しいものを特にないツールを知っていませんが、runOrder parameter in maven surefire、約遊ぶことができます。そのページから:

はテストがで実行される順序を定義サポートされる値は あり、「アルファベット」、「reversealphabetical」「ランダム」、「時給」 (偶数時間のアルファベット、奇数にアルファベット逆。 「failedfirst」、「balanced」、および「filesystem」)。

奇数/偶数時間は で、クラスパスのスキャン時に決定されます。つまり、マルチモジュールビルド中に が変更される可能性があります。

単純なアルファベット順のrunOrderを実行して、最初の失敗を取り、そこから開始することができます。少なくともあなたは予測可能な実行命令を持っています。次に、失敗したテストの前に各テストを1つずつ(-Dincludesを使用して)実行して、いずれか1つが失敗したテストに失敗したことを検出します。

次に、すべての失敗したテストについて、プロセス全体を繰り返します。あなたは一晩中これをループで実行することができます。

0

毎回、きれいなデータベースコピーを使用するようにテストを修正することはできますか? DBUnitはこれを実行するための優れたツールです。

http://www.dbunit.org/

+0

残念ながら、そうではありません。データの読み込みには〜20秒かかりますが、これは〜700回のテストには高価です... –

+0

十分な公正 - 特定のテストに必要なデータだけを読み込むことができますが、あなたが提案している限り、利益はありません。 – TrueDub

関連する問題