web-dev-qa-db-ja.com

アジャイルな方法:統合テストと機能テスト、またはその両方?

私はしばらくの間アジャイルをやっているオフィスで働いています。私たちはプロジェクト管理にスクラムを使用し、XPのエンジニアリングプラクティスを組み合わせています。それはうまく機能し、私たちは常にレッスンを学び、プロセスを洗練しています。

テストの通常の方法について説明し、これをどのように改善できるかについてのフィードバックを取得したいと思います。

TDD:First Line of Defense私たちは単体テストについて非常に信心深く、開発者も包括的なテストを作成し、常にモックでSUTを分離するのに十分な経験があると思います。

統合テスト私たちが使用する場合、統合テストは基本的に、モックを使用しない単体テストと同じです。これは、単体テストをすり抜けたいくつかの問題をキャッチする傾向があります。これらのテストは、通常、仕様フレームワークのbefore_eachセクションとafter_eachセクションで多くの作業が行われるため、読みにくい傾向があります。意味のあるものにする。

機能テスト通常、これは構造化されていますが、手動で行います。かっこいいSeleniumとWindmillで遊んだことがありますが、少なくともまだ十分ではありません。

他の誰かがどのように物事をしているのか聞きたいです。統合テストまたは機能テストが十分に行われていれば、もう一方は無視できると思いますか?

35
ChrisInCambo

ユニット、統合、および機能テストは、同じコードを実行していますが、異なる観点から攻撃しています。違いを生むのはこれらの視点です。あるタイプのテストをやめた場合、その角度から何かがうまくいく可能性があります。

また、単体テストは、特にTDDを実践している場合は、コードをテストすることではありません。 TDDは、コードをより適切に設計するのに役立ちます のプロセスでは、最後に一連のテストのボーナスが追加されます。

継続的インテグレーションサーバーを実行しているかどうかについては言及していません。設定することを強くお勧めします( Hudson は簡単に設定できます)。次に、コードのすべてのチェックインに対して統合テストと機能テストを実行できます。

24
Garry Shutler

私たちは、Seleniumテストの堅実なセットが、実際に顧客が品質に期待するものを非常にうまくまとめていることを経験しました。したがって、本質的に、私たちはこの議論を行ってきました。Seleniumテストの作成が単体テストの作成と同じくらい簡単である場合、単体テストにあまり焦点を当てるべきではありません。

そして、もしisアプリケーションに何の影響も及ぼさないバグがどこかにあるとしたら、誰が本当に気にしますか?しかし、現実の複雑さを取り巻く問題は常にあります。機能テストが正しいシナリオをキャプチャしていると確信していますか?アプリケーションの動作に直接表示されない他のシステムによって引き起こされる根本的な複雑さが存在する可能性があります。

実際には、Seleniumテストの作成(selenesではなく適切なプログラミング言語を使用)does最初の問題をドリルスルーすると、非常にシンプルで楽しいものになります。しかし、私たちはまだユニットテストをあきらめるつもりはありません。

5
krosenvold

単体テスト、統合テスト、機能テストはすべて異なる目的を果たします。他が高レベルの信頼性で実行されているという理由だけで1つを破棄するべきではありません。

4
Andrew Grant

私はあなたの機能テストがあなたのtrueテストであると言うでしょう(そしてこれは単なる意見の問題です)。つまり、アプリケーションの実際の使用法を実際にシミュレートするテストです。このため、何があっても決してそれらを取り除くことはありません。

まともなシステムが進んでいるようですね。失うものが何もない場合は、すべてを保管してください。

4
Ali Afshar

私の現在のクライアントでは、単体テストと統合テストを実際に区別していません。事業体は(自社開発のORMフレームワークを使用して)基盤となるデータレイヤーに非常に依存しているため、実際には真の単体テストはほとんどまたはまったくありません。

ビルドサーバーは、チームビルドで継続的インテグレーション(CI)を使用してセットアップされており、遅いテストでこれが過度に詰まらないように(完全なテストスイートをサーバーで実行するには1時間以上かかります)、テストを「遅い」に分割しました1日に2回実行されるテストと、継続的インテグレーションの一部として実行される「高速」テスト。テストメソッドに属性を設定することで、ビルドサーバーは2つの違いを知ることができます。

一般に、「遅い」テストとは、データアクセスを実行したり、Webサービスを使用したりする必要があるテストです。これらは、一般的な慣例により、統合テストまたは機能テストと見なされます。例:CRUDテスト、操作するオブジェクトのセットを必要とするビジネス検証ルールテストなど。

「高速」テストは、単体テストに似ており、テストのために単一のオブジェクトの状態と動作を合理的に分離できます。

10分の1秒以下で実行されるテストはすべて「高速」であると考えます。それ以外のものは遅く、おそらくCIの一部として実行すべきではありません。

開発の一環として使用するテストの「フレーバー」にとらわれすぎないようにすることに同意します(もちろん、テストとして受け入れ基準を表現することは例外です)。個々の開発者は、自分のコードに最適なテストの種類を決定する際に、自分の判断を使用する必要があります。事業体の単体テストを主張しても、CRUDテストのような欠点が明らかにならない場合があります...

3
Hans Løken

ユニットテストは、段落内の単語のスペルが正しいことを確認するものと似ています。機能テストは、段落が意味をなし、それが存在するドキュメント内でうまく流れることを確認するようなものです。

3
David Herron

UIを介して何をテストするかを決定する方法として、Gojko Adzicの「フェイスセービングテスト」の概念が本当に好きです: http://gojko.net/2007/09/25/effective-user-interface-testing /

1

私はTDDでさまざまな種類のテストを分離しない傾向があります。私にとって、TDDはテスト駆動開発であり、ユニットテスト駆動開発ではありません。したがって、私のTDDプラクティスは、単体テスト、統合テスト、機能テスト、および受け入れテストを組み合わせたものです。これにより、一部のコンポーネントは特定のタイプのテストでカバーされ、他のコンポーネントは他のタイプのテストで非常に実用的な方法でカバーされます。

私は 質問 にこのプラクティスの関連性について質問しましたが、簡単な答えは、実際には、ビルドごとに自動的に実行される高速/単純なテストと、低速/複雑なテストの実行頻度が低いことです。

1
mouviciel

私の会社は機能テストを行っていますが、ユニットテストや統合テストは行っていません。私はそれらを採用することを奨励しようとしています、私はそれらがより良いデザインとすべてが順調であることのより速い兆候を奨励していると思います。機能テストを行う場合、単体テストが必要ですか?

1
danswain

ユニット、統合、機能テストはすべて異なる目的を果たすため、これらすべてを実行する必要があります。
私にとって重要な点は、書き込みテストの方法が非常に重要であり、TDDが十分ではないということです。BDD(ビヘイビア駆動開発)は優れたアプローチを提供します...

0
lapinferoce