2011-09-23 17 views
6

可能性の重複:
Is Unit Testing worth the effort?愚かに聞こえるかもしれませんが、実際には単体テストですか?

さて、私はユニットテストの目的は、一般的に言っているか知っているが、私は私を気にいくつかのことを発見しました。

1) 早期バグ発見テストの目的。したがって、後の繰り返しの中で、私がコードを少し変更した場合、自動化されたテストでは私のことを忘れてしまったことがあります。

しかし、1クラスAのためのユニットテストを書くとき、彼はクラスB を模擬しているクラスB

それを呼び出す、私はクラスAを持っており、それはいくつかの他のクラスのインスタンスとの対話であると言うことを言いますだから将来的には、クラスBを変更してバグを引き起こすと、クラスBの単体テストでしか反映されません(Aのテストでは実クラスBを使用しませんが、モックです固定入力と出力)。 ユニットテストで、気づいていないバグを早期に知らせることができませんでしたか?私は変化しているクラスのバグを認識しています。ユニットテストは必要ありません。自分の変更の結果を忘れて、 "忘れられた"クラスのバグを引き起こすテストが必要です。ユニットテストで可能です。または私は間違っていますか?

2) メソッドを呼び出す際のモックと適切な期待、それらの入力と戻り値を書くときには、テスト対象のクラスがどのように実装されるのかを知る必要があります。 それはテスト駆動開発と矛盾すると私は思う。 TDDでは、まずテストを書いて、それによって駆動され、コードを書きます。 しかし、テストしなければならないコードを書かない限り、私は正しい期待(一般的なテスト)を書くことができません。これはTDDと矛盾しますね。

モックの代わりに実際のオブジェクトを使用すると、これらの問題はどちらも解決できます。しかし、それは単体テストではありません、そうですか?単体テストでは、テスト中のクラスはシステムの残りの部分から分離されなければならず、実際のクラスを使用せずにモックされなければなりません。

私はどこかに間違っていると確信していますが、どこに見つけることができません。私は読んで読んでいて、私が間違って理解しているものは見つけられません。

+1

関連:http://stackoverflow.com/questions/286587/are-you-really-using-unit-tests – Thilo

答えて

4

厳密に言うと、実際のコードに集中するのではなく、単体テストを書く時間が長くなります。

コードカバレッジを100%達成する方法はありません。私は私のアプリケーションを単体テストしますが、私はその価値がないと感じます。しかし、誰もそれに同意するわけではありません。

コードを変更すると、単体テストが失敗し、なぜ失敗したのかわかりませんが、その価値はありません。

私はユニットテストのない大ファンです...あなたが..........モックが、すべてが大きな課題である

を模擬しかし、今日の企業は、TDDのアプローチのためにしようとしています。

+0

はい、「コードを変更すると、単体テストが失敗し、その失敗の理由がわかります"しかし、あなたが何かを模倣した場合、私はいくつかのメソッドを変更すると、そのメソッドのテストだけが失敗する可能性があります。 私は一般的なテストではなく単体テストについて話しています。 私がすべてを模倣すれば、あるクラスの変更は他のクラスのテストに影響を与えません。もし私がすべてを模倣しなければ、それは私が知る限り単体テストではない。 – SadClown

+0

@sadClownはモックオブジェクトのアイデアではない、afaik。 Mockオブジェクトは、例えばhttp要求を表すのに使用される。あなたはモックオブジェクトをテストせず、テスト内で使用され、テストしているコードに渡されます。 – NimChimpsky

3

かんたん回答:はい、本当に便利です。

TDDは素晴らしく、理論的にはすべてですが、実際にはそれを見たことはほとんどありません。単体テストはtddにバインドされていません。変更後もまだ動作することを確認するために動作するコードのunittestを書くことができます。このテストでは何が間違っているのかをすぐに指摘したため、unittestのこの使用法は私に数え切れないほどのバグ修正をもたらしました。

私はモックを避ける傾向があります。ほとんどの場合、私の意見では価値がありません。モックを使用しないと、私の単体テストがもう少し統合テストになるかもしれませんが、それは仕事を完了させます。クラスを確実にするために、クラスは設計どおりに動作します。

+0

コード内でオブジェクトをモックするために使用するアプローチは何ですか?オブジェクトをモックするための簡単な嘲笑魔法はありますか?または、コード内でオブジェクトをまったく使用しないでください。 –

4

初めてTDDと単体テストを実装しました。私は偉大だと思っています。私はそれをさらに価値のあるものと想像している連続した統合環境で使ったことはありません。

マイプロセス:

  1. は、(それがなど serivce層、またはドメインオブジェクト、も)ビジネスロジックが行くクラスのスケルトンを作成します。
  2. は、テストを書く、そしてテストで メソッド名と必要なfunctionaility定義 - その後、テストされている実際のクラスメソッドを書く次にスケルトン法(小さいながらも素敵なプラス)
  3. を書くために私 IDEを求められます。
  4. テストを実行し、デバッグします。

私はもうテストを書くことなくコードを書くことができます。本当に助けになります。バグを直ちにキャッチすると、実際に構造化された簡単な方法でコードや開発を精神的に整理するのに役立ちます。もちろん、既存の機能を破壊するコードは直ちに検出されます。

モックオブジェクトをまだ使用する必要はありません(春を使用して、呼び出し側のサービスレイヤーとコントローラメソッドから直接離れることができます)。

1

0)いいえ、そうではありません。愚かな音、私は意味する。それは完全に有効な質問です。

悲しい事実私たちは、銀色の弾丸で包み込まれ、ヘビ油で滑らかな産業であり、何かが意味をなさない場合、あなたはそれを疑問視する権利があるという事実です。どんな技術でも、エンジニアリングのあらゆる部分へのアプローチは、特定の状況においてのみ適用可能です。これらは一般的には良くないとよく文書化されているので、すべてが悪化して、私の方法はあなたの意見よりも優れています。

私は単体テストで成功と失敗を経験しました。私の経験では、正しく適用された場合、実際に非常に役立ちます。

ユニットテストを続行するにはすべてが急激に変化しているので、大規模なスクラッチ開発作業を行っているときは、良いテクニックではありません。これはメンテナンスフェーズでは優れたテクニックです。なぜなら、あなたはそれが想定どおりに動作する必要がある、より大きな全体の小さな部分を変更しているからです。

私にとって、単体テストはテスト駆動開発ではなく、契約ごとに設計されています。単位テストでは、インタフェースが違反していないことを確認します。これから、同じ人物がユニットとそれに対応する単体テストを書くべきではないことが分かりやすいので、私自身のペットプロジェクトのような非常に小規模のものでは決して使用しません。大規模なプロジェクトでは、私はそれを提唱しますが、契約による設計が採用され、プロジェクトがインターフェイスの仕様を重要な人工物として認識している場合に限ります。

テクニックとしてのユニットテストは、ユニットサイズにも影響されます。必ずしもクラスがそれ自身でテスト可能であるとは限りません。私の経験では、クラスは一般にユニットテストには小さすぎます。クラスそのものをテストしたくない場合は、機能単位をテストする必要があります。 Javaスタイルの言語を使用している場合は、個々の展開可能な(インストール可能な)バイナリ(jarやDLLなど)が、私の書籍やパッケージでより良い候補になります。

1

単体テストそのものは愚かではなく、プロジェクトによって異なります。

単体テストは、TDD開発だけでなく、あらゆる種類のプロジェクトで良いと思います。私の本当のプロは、ユニットテストで貴重なコードをプロジェクトにラップすると、それが意味するものがまだ機能しているかどうかを知る方法があるということです。

実際の問題は、誰かがあなたのコードをばかげている場合、テストがまだサクセンドしているかどうかを知る方法があるはずですが、手動で実行することではないということです。たとえば、Eclipse + Java + Mavenの例を取ることができます。あなたのMaven Javaプロジェクトでユニットテストを使用する場合は、誰でもテストを自動的に実行します。だから、誰かがあなたのコードを乱してしまったら、次回ビルドしたときに、ユニットテストに失敗したことを示す "BUILD FAILED"コンソールエラーが表示されます。

私の要点は:単体テストは良いですが、コードを変更するたびにテストを実行しなくても、問題を起こしていることを知っておくべきです。

関連する問題