ユニットテストにどれくらいの時間を費やしていますか?


27

私が働いていた会社では、経営陣はユニットテストのコードカバレッジが99%以上でなければならないと主張しました。これは、コードよりも多くのテストを書くことになりました。実装に1日かかった単一のクラスのテストを書くのに、文字通り3日かかりました。

しかし、その結果、TDD、テストツール、プラクティスなどについて多くのことを学びました。

私がその後働いた会社では、単体テストは未知のものでした。それは誰かが前に聞いたことがあるかもしれないものでした。単体テストの概念を紹介するのに苦労しましたが、効果はありませんでした。

さて、自営業として、私は疑問に思う-あるどのくらいの時間は本当にユニットテストに費やす必要が?ほとんどがiPhone / Android開発者であるため、コードのどの部分をテストでカバーする必要がありますか?


私の前の会社では、Java EE、ストライプ、およびストラットフレームワークでした。私が述べたように、今ではほとんどがiPhoneとAndroidの開発です。
マギー

TDDは、コードの前にテストを書くことを意味します。これは「事後」テストであるように思えますが、これは別のことです。

マネージャーはこの手法を気にしませんでした。私のチームリーダーはTDDを主張しました。それは両方の組み合わせとして最終的に:)
マギー

:マギーは、あなたがこの記事に興味深い見つけるかもしれないfastcompany.com/magazine/06/writestuff.html

時間を推定するためのメトリックはありますか?JS / .NETコードのツール?
ヘルボーイ

回答:


16

必要な単体テストの量は、いくつかの要因によって異なります。

  • 製品サイズ(プロジェクトが大きいほど、少なくともいくつかの単体テストを含める必要性が大きくなります)
  • 必要な品質レベル(可能な限り迅速にリリースする必要があるソフトウェアをすばやくまとめており、いくつかのマイナーなバグが許容される場合、ユニットテストなどのテストをスキップするよう強制される可能性があります)
  • 製品のタイプ(UIは単体テストが可能ですが、プロジェクトの重いGUIセクションで単体テストをスキップし、代わりに手動でテストする方が簡単な場合があります)
  • コーディング能力/履歴(通常どのような種類のバグを作成しますか?ユニットテストで通常検出されるものですか、それとも別のタイプのテストで通常検出されるものですか。

10

製品グループでは、単体テストのコードカバレッジを50〜70%、単体テストとテスト自動化の組み合わせで90%以上をカバーしています。単体テストの作成に費やされる典型的な時間は、3〜4日間のヘッドダウンコーディングが必要なすべての機能に対して約1日です。しかし、それは多くの要因によって異なります。

99%のコードカバレッジは素晴らしいです。単体テストは素晴らしいです。しかし、単体テストだけで99%のコードカバレッジは得られますか?単体テストだけで多くのカバレッジを得ることができるとは信じ難いです。

クラスのテストの作成に3日間を費やした場合、それ以外の場合は実装に1日かかりました。なぜこれほど時間がかかったのか、コードを共有したのかについては詳しく説明しませんでした。推測から、私はあなたが実際にあなたのクラスのための本当のユニットテストを書いているのではなく、実際にテスト自動化を書いていたと推測しています。そして、実際には何の問題もありません-2つの異なるタイプのテストの違いを認識している限り。

しかし、あなたは3日間のテストライティングは単一のクラスのためだけだったと言いました。クラス自体が単体テスト用に設計されていない可能性があります。クラスはUIを実装していますか?ネットワーキング?ファイルI / O?その場合、Javaランタイムをテストするために、ランタイムと対話するビジネスロジックよりも多くのコードを書くことになっていた可能性があります。

TDDは、インターフェイスおよび依存関係へのインターフェイスの観点から考えさせます。単一の機能のUI、ネットワーク、およびファイル/ ioを実装する単一のクラスは、複数のクラスに分けて提供する方がよい場合があります-ネットワーク用、ファイル/ io用、UIをモデルビューアーコントローラーデザインに分割します。次に、依存関係の単純なモックオブジェクトを使用して、それぞれに適切なテストを実装できます。もちろん、これにはすべて時間がかかります。したがって、このタイプの設計では、コーディングに1日、テストの作成に3日ではなく、3日間のコーディングと1日間のテストの作成が必要になる場合があります。ただし、コードの保守性と再利用性ははるかに向上します。


1
素晴らしい答え。そのほとんどはテストするには複雑すぎたので、それについては正しいです。そして、より良いユニットテストに合わせてクラスをいくつかの小さなユニットに分割するのは少々過剰に思えます。クラスと付随するテストのコードを添付したいと思います。あなたの意見を聞きたいのですが、許可されているかどうかはわかりません。コードは厳密には私のものではなく、私はもうその会社で働いていないので、トラブルを避けたいと思います。
マギー

2
そのため、最初にテストを作成する必要があります。その後、ロジックが結合する自然な場所を見つけることができます。

10

単体テストは、メンテナンス時に成果を上げます。長寿命のアプリケーションを計画している場合は、現在考えているよりも多くの時間をメンテナンスに費やすことになります(まだ試していない場合は、成功したプロジェクトがどれくらい長く続くか驚くでしょう)

必要なのは、誤って機能を変更した場合、テストが中断するため、これらのことをできるだけ早く見つけることです。機能が予期せず変更された場合、顧客は強く嫌います。


3
あなただけのバグB&C導入するバグAを修正するとき、あなたは悪く見える
JeffO

BとCは、テストやないでキャッチされた場合に依存

「現在考えているよりもメンテナンスに多くの時間を費やします」-実際、特にSW製品は通常、計画された寿命よりもはるかに長く続くことを考慮してください。
ペテルトレック

プロジェクトが成功するかどうかを事前に判断できないため、実際に長寿命のアプリケーションを「計画」することはできません。テストの予算を立てるときは、常に考慮する必要があります
エランガルペリン

1
@Eran、だからあなたはテストのために予算を立てる必要がないように失敗を計画すべきですか?

4

TDDを実行している場合は、コードと同時にテストを作成し、数分(またはそれ以下)ごとにテストを切り替えます。テストに費やす明確な時間はありません。TDDを使用すると、テスト範囲がしっかりしていることが簡単にわかります。

事後の単体テストの場合、コードが変更のために壊れているかどうかを知らせるテストを作成する必要があります。ここではカバレッジメトリックに依存しませんが、パブリックインターフェイスへのユースケースとパラメーターに基づきます。これは最終的にあなたの良い味と経験に基づいています。


うん、私にとってこれは本当です(実際、私は通常、テストの作業と製品コードの作業を数分ではなく、数ごとに繰り返します)。
ジョナサンハートリー

2

テストに時間を費やさない場合、ライブコードでデバッグするのにさらに時間を費やします。
したがって、テストに必要なだけの時間を費やして、すべて(またはコードの99%)をカバーします。


4
なぜ人々はそのようなデバッグの妄想を持っているのですか?ツールを知っていれば、デバッグに5分以上かかる問題に遭遇することはめったにありません。デバッグが難しい問題は、ほとんどスレッドに関連していますが、とにかく単体テストは役に立ちません。
コーダー

3
@Coder。これは、経験があり、テストがブラインドデバッグよりもはるかに有用であることを知っているからです。
OZ_

2
依存します。ユニットテストは、しばしば逆効果であり、誤った安心感を与えます。また、適切に構造化されたコードでは、「ブラインドデバッグ」問題に陥ることはありません。問題が発生した場合、どこを見ればよいかがわかります。そうでない場合は、完全なコード/設計レビューを行います。参照してください:programmers.stackexchange.com/questions/86636/...
コーダー

4
それは多くのTDD支持者の問題です。彼らはすべてのバグを見つけるためにテストに依存しながら、デバッグと設計に対して敵対的な姿勢を持っています。次に、実稼働コードでは、アプリケーションがメモリをリークし、ハンドルし、マルチコアでクラッシュします。これは「WTH」のようなものです。TDDは単なるツールであり、目の前のタスクに応じて、非常に生産的または非常に非生産的です。リンクされた投稿のすべてのハードケースの単体テストを作成してみてください。製品を出荷することはありません。
コーダー

1
「ツールを知っていれば、デバッグに5分以上かかる問題に遭遇することはめったにありません。」-@Coderどのタイプのアプリケーションを見ているのだろうか。
カークブロードハースト

2

他の人がすでに指摘したように、それはソフトウェアの種類に大きく依存します。あなたが言及する3:1のテスト/開発時間の比率は、平均的なプロジェクトには少し多すぎるかもしれませんが、ミッションクリティカルなアプリには完全に問題ないかもしれませんし、ライフクリティカルなシステムには少なすぎるかもしれません。

99 +%の単体テストのカバレッジは、平均的なアプリの場合には同様に多すぎるかもしれませんが、ライフクリティカルなプロジェクトには少なすぎます。

私の経験では、量産コードのかなりの部分がエラー処理コードであると考えると、ほとんどのアプリでは80〜90%のカバレッジで十分であり、これには量産コードとほぼ同じ時間の単体テストの記述が必要になる場合があります。(再び、TDD方式で真剣に作業している場合、2つは完全に絡み合って実質的に1つのタスクになるため、実際の比率を推測することしかできません。)


モバイルアプリの経験はありますか?単純なモバイルアプリケーションで許容されるテスト/開発比はどうなりますか?
マギー

@Maggie、残念ながらそうではありません。(私は1つを書くために必要なもしそうなら、私はおそらく:-)ユニットテストの私のいつも時間以上費やすだろう
ペーテルTörök
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.