0

The system I am working has (fortunately) JUnit unit tests already, which are covering some percentage of the code functionality (Better than nothing, I suppose).

The methods in the system are highly dependent to each other and the combination of the parameters that can be sent to a method as an input is huge. Let's see an example:

public void showMessage (final Language language, final Applications apps, final UserID userId)

The above method can have more than 300,000 different messageboxes poping up, based on different apps and userIds. Apart from the fact that whether putting such huge pressure on a single method a couple of them at least, sounds resoanable or not (which IMO cannot be justified design-wise), we are encountering the fear of a bug which can cause huge problems.

That being said, what we found is simply is as follows:

  1. Refactoring JUnit Unit Tests
  2. Extract a lot of objects in the method as parameters
  3. Create an Object Factory
  4. Feed the unit tests with different inputs created by the factory (brute-force test, maybe?)
  5. Check the outcome of the newly refactored tests

So basically, the question is as follows:

Creating Integration Tests on top of Unit Tests: Possibilities and Challenges? Is this a customized approach or this is a rational standard approach? Where to put such tests in both the project files and project build lifecycle, should they be built all the time to complete the build process?

Any type of feedback/comment, both from JUnit implementation limitations and Design/Idea limitations.

4

2 に答える 2

2

統合テストの要点は、コンポーネントが正しく相互作用することを検証することです。各単体テストでは、コードの単一のアトミック部分を検証する必要があります。一般的な経験則 (私の経験では) 10 行を超えるコードの単体テストがある場合、何か間違ったことをしたことになります。これはもちろん、技術的に@Before/@Afterブロックにあるテストの一部であるコードを除外します。単体テストに関するもう 1 つの点は、統合テストである他のものに依存できないことです。単体テストは静的データを使用するため、上記のアプローチは使用しません。これは、古い単体テストがリリース前に実行される回帰スイートに移動する回帰テストでも大きな役割を果たします。

統合テストは、DBUnit、Selenium などのアイテムに依存するものになります。データベースや GUI などの依存関係を実行/検証する必要があります。単体テストは、開発者がチェックインを実行する前に実行する必要があります。統合テストは、変更があるたびに実行する必要があります (または、潜在的なエラーに対する許容度に関係なく、1 日 1 回では少なすぎます)。

繰り返しになりますが、単体テストでは動的データを使用しないことをお勧めします。主な理由は、アサートが失敗する可能性があるためですが、単体テストが無効であることを証明するものではありません。

アップデート

ええ、私が言ったように、それは統合テストだと思いました。私が確信していないのは、統合テストでは、システムの単体テストではなく、一連のシステムをテストしていることです! 単体テストと統合テストの間の依存関係も問題です。IMO!

返信:
あなたは単体テストと統合テストの根本的な誤解を持っています。コードのユニット、つまり関数には依存関係がありません。アーキテクチャに深刻なオーバーホールが必要な場合です。統合テストでは、2 つのバラバラなモジュールが相互に作用することを証明するさまざまなシナリオを作成する必要があります。これは、2 つの単体テストのロジックを 1 つの "統合" テストに結合することを意味するものではありません。

于 2012-11-08T16:39:53.237 に答える
0

アミール、

「単体テストの上に統合テストを構築する」とはどういう意味ですか? 統合テストはかなり粗粒度のブラック ボックス テストであり、実際のデータベース、JMS キュー、サード パーティの Web サービスなどと通信するサーバーにデプロイされたアプリケーションをテストします。通常、所有していないインフラストラクチャの一部をモックしたい場合があります (サードパーティの Web サービスなど)。

統合テストは単体テストよりもはるかに遅くなるため、ビルドごとに実行しない傾向があります。jenkins のような CI サーバーを使用する場合は、すべてのテスト (ユニット + 統合) を実行する別の統合ビルドを作成できます。

単体テストで動的データについて言及しました。新しいコードが導入されたときに動作の変更が発生したかどうかを確認したり、いくつかのコーナーケースをテストしたりして、実行されるたびに同じ実行パスをカバーすることを確認するために、静的入力データを使用した単体テストを行うことは良いことだと思います...

しかし..

また、ランダムな入力データでアプリケーションに負荷をかける一連のテストを追加することもお勧めします。私の知る限り、Lucene/Solr の連中はそのアプローチを採用し、無作為化テスト用のフレームワークを所有していることもオープンソース化しました。それらのリンクを見てください:

http://labs.carrotsearch.com/randomizedtesting.html

http://vimeo.com/32087114

レガシー ソフトウェアの一般的な使用方法については、M. Feather の「レガシー コードを効果的に使用する」をお勧めします。優れた本です。既存のコードを単体テストでカバーし、コードの品質を向上させる方法についていくつかのアイデアを提供してくれるかもしれません。

http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052

于 2012-11-19T18:37:23.053 に答える