職場で単体テストを使用していますか?それらからどのようなメリットがありますか?[閉まっている]


18

ユニットテストを勉強してコードに適用することを計画していましたが、同僚と話した後、一部の人はそれは必要ではなく、ほとんど利益がないと私に提案しました。また、実稼働ソフトウェアを使用して単体テストを実際に行っている企業はごくわずかであると主張しています。

私は、人々が職場で単体テストをどのように適用し、それらを使用することで得られるメリット、たとえば、コード品質の向上、長期的な開発時間の短縮などに興味があります。


13
「彼らはまた、本番ソフトウェアで単体テストを行う企業はほとんどないと主張しています。」つまり、高品質のソフトウェアを製造している企業はごくわずかです。あなたはどのグループと提携しますか?「少数の企業のみ」が否定的な声明になりうるのはどうしてですか?非常に収益性の高い企業はわずかです。それは悪いことですか?本当に楽しい職場になっている企業はごくわずかです。それは悪いことですか?廃棄物の発生を最小限に抑える企業はわずかです。それは悪いことですか?彼らの「ほんの数社」のコメントは無意味です。
-S.Lott

2
そのまた、おそらく間違って、逸話的に、私は少なくとも、ユニットテストのいくつかのレベルで行っていない会社のためにまたはで仕事にまだきた
JKを。

1
ユニットテストは「ほとんど利点がない」と考えているプログラマーは経験が浅い、または効果的なユニットテストの書き方を知らないだけだと思います。
トビー

このサイトの開発者は、単体テストをどの程度使用していますか?
-JeffO

1
@ S.Lott:無意味なはい、まだ、ユニットテストをしたくない人がユニットテストをしないという議論としてまだ使われています。私はここで彼らの見解を擁護しているのではなく、まったく逆です。しかし、その声明はまだなされており、それを作った人はその価値を確信しています。それは彼らであるので、無意味であることをテストすることの実際の利点を確信する必要があります。
ニュートピア

回答:


20

それらのいくつかは、それが必要ではないことを私に示唆しています

まあ、厳密な意味では正しいです。テスト、コードレビュー、ソース管理なども厳密には必要ありません。非常に少数の賢明な開発者だけが、長期的にこれらなしで作業を行います。私たちのほとんどは、これらがベストプラクティスである理由を(多くの場合、私たち自身の間違いから難しい方法で)学びました。

そして、それはほとんど利点がありません。

ほとんどの場合、これは当てはまりません。つまり、今後数年間、使用中(つまりメンテナンス中)になるはずの製品ソフトウェアについて話している場合です。

また、本番ソフトウェアで単体テストを行う企業はごくわずかであると主張しています。

これ本当かもしれませんが(私の経験ではますます少なくなっていますが)、単体テストの価値については何も言えません。これとは対照的に、古い冗談「たわごとは良いです-500億個のハエは間違ってはいけません!」;-)

仕事で単体テストを適用しましたか。それから何を得ますか?(たとえば、コード品質の向上、長期的な時間の短縮など)

私は、可能であればいつでも、10年以上にわたってユニットテストを仕事に適用しています。それが機能することを知っている私のコードに対するその自信感-そして、それを信じるだけでなく、いつでも、どこでも、数秒で、何度も何度もそれを証明することができます-貴重です。既存の機能を壊す心配をせずに、コードをリファクタリングしたり、デザインを改善したり、バグを修正したりする勇気を与えてくれます。昔の「コードと祈り」には決して戻らないでしょう。


14

私は単体テストを行いますが、仕事ではありません(またはほとんどありません)

私が得たテストの主な利点は、リファクタリングが非常に簡単になり、リグレッション(つまり、すでに修正されたエラーの再導入)に気付くことです。

「ビルド」を使用してテストを実行します。実行中のテストでソフトウェアをチェックアウトし、変更を加えてすべてのテストが実行されるまでチェックインしません。

そのため、私の経験では、テストを書くことは、孤独な方法で行われた場合、ほとんど役に立ちません。他の人が行った変更に対応するために常にテストを修正する必要がある場合、テストが同僚によって削除される可能性がある場合(以前のジョブで発生します)チームの残りのメンバーによって即座に燃え上がる利点。

チーム全体が同意する場合(そして、簡単な1人のチームの場合)、私の経験では、テストはプロジェクトの品質、スタイル、堅牢性にとって大きな利点です。

しかし、「少数の企業だけがコードを自動的にテストする」と正直に信じており、とにかく時間の無駄だと確信しているチームでは、利益を得る希望はほとんどないように見えますが、エラーを指摘する際の「時間のロス」の原因となります。

テストを導入する最良のチャンスは、あなた自身の責任の範囲内の小さなプロジェクトです。そこで、あなたは輝いて、テストの価値を示す機会を得るでしょう。


1
ネガティブに聞こえて申し訳ありませんが、私はまだ「
うなり声

非常に良いアドバイス。問題は、正しく行われた場合、実際には単体テストの利点が見えないことです。単体テストを行わない場合にのみ、潜在的に害が見られます。したがって、理論ではなく統計を使用して他の人を説得する必要がある場合は、ほとんどうんざりしています。
ピータークルイトホフ

12
@keppla、私はチームメートがユニットテストのことを聞いたこともないプロジェクトでユニットテストを書いてきました。私のテストがなんとか気付かずにすり抜けていたであろういくつかのバグを捕まえることができたら、他の人は気づき始め、すぐに彼ら自身でユニットテストを学びたいと思いました。具体的な証拠が重要です。
ペテルトレック

1
@keppla、公平です、チームメイトが常識を失うレベルに偏っている場合、論理的な証拠で彼らを説得する方法はありません:-(が、それなしで、見込みはありません。
ペーテルTörök

3
インターフェイスを変更したり、クラスを削除するなどして、テストを頻繁に「中断」します。「最初にテスト」を行うと、これは「中断」ではなく、最初のステップとして「赤」になります。しかし、「機能するまでいくつかの行を追加するだけ」という考え方にあるとき、テストはさらに行に過ぎません。そして、このような誰かによって「修正」されると、テストは実際に役に立たなくなるまで、有用性が低下する傾向があります。自己実現予言4tw!
ケプラ

7

私はあなたの同僚に味方する傾向がありますが、それはある程度までです。

単体テストの問題は、コードの大まかな調査によって、それが何があっても機能することが明らかになっている些細なケースに、頻繁にかつ無意識に書かれていることです。例えば:

def add(x, y)
  x + y
end

追加が実際に任意に選択されたユースケースで機能することを確認するための12個のテストとともに。ああ...

単体テストの背後にある一般的な前提は次のとおりです。コードにバグが含まれていない場合、それは十分にテストしていないためです。さて、いつ適切なユニットテストを書くか。回答:

  1. テストしているとき
  2. デバッグしているとき
  3. あなたが本当にトリッキーなものを開発しているように

あなたが何らかの種類のWebアプリを開発していると仮定して、それぞれを見ていきましょう。

新しい機能にいくつかのコードを書くと、それは今のところ合理的に機能するはずです。次に、ブラウザに手を伸ばして、より集中的にテストすることで動作することを確認しますか?Bzzzt!...間違った答え。単体テストを作成します。あなたが今そうしないならば、あなたはおそらく決してそうしないでしょう。そして、これは単体テストが非常にうまく機能する場所の1つです。つまり、高レベルの機能をテストすることです。

次に、バグを見つけます(誰も見逃しませんか?)。これにより、ポイント2が得られます。コードに戻り、手順を開始します。一貫性のある正しいデータを保持することが重要な主要なブレークポイントでユニットテストを作成します。

最後のポイントは、その逆です。あなたは、メタプログラミングの負荷を伴ういくつかの毛深い機能を設計しています。数千の潜在的なシナリオを含む意思決定ツリーがすぐに生成されるため、最後のシナリオがすべて機能することを確認する必要があります。そのようなことを書くとき、ここまたはそこにある単純な見た目の変化は、食物連鎖のさらに下に想像を絶する結果をもたらす可能性があります。SQLトリガーを使用してMPTT実装を設計しているとしましょう。これにより、複数行のステートメントで動作できるようになります。

この種の厄介な環境では、通常、テストを高度に自動化する必要があります。したがって、テストデータの生成を自動化するスクリプトを作成し、このテストデータに対して単体テストのボートロードを実行します。これを行う際に見失うことのない重要なことの1つは、ユニットテストジェネレーターのユニットテストも記述する必要があることです。

ボトムライン:ユニットテスト、間違いなくはい。ただし、基本的な機能については、デバッグのために実際に必要になるまで、または毛深い機能が適切に動作することを確認するまで(後者の場合、テスト自体を含めて)ください。


ケント・ベックが言ったように、「壊れる可能性のあるすべてのものをテストする」。
ペテルトレック

1
彼と心から同意する。私の主な希望は、OPが次のことに注意することです:該当する場合はテストをテストすることを忘れないでください。:-)
デニスドバーナーディ

7

すべてのコードをテストする必要があります。それについての選択はありません。

テストされていないコードは役に立たない:何もすることが信頼できない。

単体テストを作成することも、高レベルの統合テストや受け入れテストを作成することもできます。

単体テストは、記述しやすく、デバッグしやすく、管理しやすいです。

統合テストは、ユニットが実際に機能するという前提に基づいています。ユニットテストなしで、ユニットがどのように機能するかをどのように知っていますか?統合される個々のユニットが実際に機能することがわからない場合、統合テストをどのようにデバッグできますか?

同様に、受け入れテストは、動作するすべての部品に依存します。一連の単体テストがなくても、どのように部品や部品が機能するかを知ることができますか?

テストは必須です。上位レベルのテストはすべて、実際に動作しているユニットに依存しています。

そのため、ユニットテストは論理的に必要です。他に選択肢はありません。


1
他に選択肢はありません...品質を気にするなら。ほとんどのソフトウェア組織は、品質に真剣に関心を持ちません(これまでのところ、破損していることがわかっているソフトウェアの出荷を拒否しています)。
ジョーリセブレヒト

@Joeri Sebrechts:それは品質の問題ではありません。これは「やったか」の問題です。悪いソフトウェアであっても、それが何かをすることを証明するためにテストする必要があります。単純なロジックは、それが機能することを証明するためのテストが必要であることを示しています。悪いテストでさえテストです。単純なロジックでは、全体のテストには部品のテストを含める必要があります。単体テストは、ロジックに必要なだけで、他には何もありません。品質に関する考慮事項ではなく、「完了」の定義によるものです。
S.ロット

1
ソフトウェアの使用は、それ自体のテストです。多くの組織がユーザーにテストを行わせることを喜んでいます。私はそれが良いことだと言っているわけではありませんが、それはそうです。実際に、配信前にテストを行わず、エンドユーザーにテストをオフロードすることを選択できます。できますが、できません。
ジョーリSebrechts

1
@Joeri Sebrechts:実際にはできません。受け入れテストのために、ソフトウェアを(ランダムに)ユーザーに引き渡すことはできません。動作していることを確認するには、ソフトウェアを少なくとも1回実行している必要があります。それはテストであり、悪いテストですが、テストです。論理的には、その不良テストには不良ユニットテストが組み込まれていました。彼らは非常に悪かったにもかかわらず、存在していました。
-S.Lott

単体テストの定義は、この議論には役に立ちません。単体テストは成文化されたテストであり、ソフトウェアを出荷するためにまったく必要ありません。(しかし、多くの状況で行うことが良いoc)
マーティンBa

6

私は書くすべてに単体テストを使用しますが、テストケースなしでは、テストされていないコードをレビューに合格させません。(しかし、カバレッジツールがないため、テストカバレッジについて推論する必要があります。

それは非常に簡単です:コードが機能することを実証できない場合(およびテスト形式の実行可能仕様よりも良い方法はありますか?)、それは機能しません

これは私に与えます:

  • 安心:私のCIサーバーは、コードベース全体が機能していることを教えてくれます。
  • コードを改善する機能:コードを再構築できます-リファクタリングできます-再構築後、何も壊れていないことがわかります。

2
これに非常に重要な警告を1つ追加します。単体テストだけでは、「コードベース全体が機能する」ことを保証しません。これは、単独で、コードの作業のすべてのユニットを確保しますが、統合の誤り、データの視覚的なプレゼンテーションのエラーなどのための巨大な可能性はまだあります
ライアン・ブルナー

ご使用の環境が「コードが機能しないことを実証できない場合、それは機能します。」を経ない限り :p
Davy8

@Ryan:もちろん、統合テストはプロジェクト全体を駆動するはずです。質問は単体テストについてだったので、単体テストについて話しましたが、もちろん、統合テストに失敗すると、コードの必要性を示す必要があります。もちろん、CIサーバーでコードベースを自動的に展開し、すべてのテストを実行する必要があります
Frank Shearar

@ Davy8:どの場合、「単体テストが機能するか」というより深刻な問題があります。
フランクシェラー

4

単体テストは規律です。コードが機能する必要はないため、多くの場合破棄されます。

ただし、堅牢でバグの少ないコードにつながる実証済みの方法です。あなたが既にいくつか言及したように、私はあなたに利益を説明する必要はないと思います。Javascriptライブラリ、フルスタックフレームワーク、または単一目的のアプリケーションなど、主要なオープンソースプロジェクトを見ると、すべてユニットテストを使用しています。

使用を推奨しない同僚はプログラマーではないと思います。もしそうなら、マーティン・ファウラーケント・ベックのような人よりも私が高く評価している人はあまりいないとだけ言っておきましょう;)。

ほとんどのベストプラクティスと同様に、利点は長期的であり、それに時間をかける必要があります。手続き型コードの長いスクリプトを書くこともできますが、2年後にリファクタリングする必要がある場合は、オブジェクト指向スタイルで記述したいと思っています。

同じことがユニットテストにも当てはまります。アプリケーションの重要な部分の単体テストを作成すると、コードをリファクタリングした後でも、常に意図したとおりに機能することを確認できます。たぶん、あなたはリグレッションのバグがないようにあなたがとても上手にコーディングします。しかし、そうでない場合、または新しいプログラマーがチームに加わった場合、過去のバグが二度と起こらないようにする必要があります。半年前に解決されたと思われるバグレポートを提出するのではなく、あなたの上司もそれに満足していると思います。


3

単体テストには、単体テストに優しい言語、単体テストに優しいデザイン、単体テストに優しい問題が必要です。

C ++、マルチスレッド設計、GUIは悪夢であり、問​​題の範囲は恐ろしいものになります。

.NET、再利用可能なシングルスレッドdllアセンブリ、純粋な計算ロジックが簡単になります。

それは価値があるか、私は本当に言うことはできません。

リファクタリングしますか?コードに「off by one」のような「愚かなバグ」がたくさんありますか?

あなたが何をするにしても、「あなたはユニットテストを持っていないので、あなたは吸う」と他人を批判するその男にならないでください。テストがあなたを助けるなら、それのために行きなさい、そうでなければ、それは銀の弾丸のようではない。


1
マルチスレッド設計が悪夢になるのはなぜですか?同期ポイントを設計し、そこでテストします。
フランク・シーラー

1
タイミングは月の満ち欠け、CPUクロック、トラッシングなどに依存するためです。1回のチェックインでテストが失敗する場合があります。運が良ければ、他の1000回ではテストは失敗します。
コーダー

1
テスト駆動のマルチスレッドのものを書きました。それは間違いなく実行可能です。
フランク・シーラー

4
ごみは、任意の言語で単体テストできます。
jk。

1
GUI相互作用の単体テストを書くのは難しいのですが、だからこそ、GUIに関係のないもの(エンジンコード)を分離しました。エンジンをGUIから分離することを決定するのに役立ちました。さらに、ユニットテストはGUIの代わりにインターフェイスとして機能し、通常必要な情報を求めて提供します。
チャンス

3

たいのですが、私は品質を気にしない企業でほぼ完全に仕事をするという不幸を経験しました。ユニットテストについて言及しましたが、「ハァッ?」ある種の外観(SOLID原則、ORM、または「すべての静的メソッドを備えたクラス」を超えたデザインパターン、または.NET命名規則に言及したときと同じ外観)。私はそのようなことを理解している会社にだけ行ったことがありますが、残念なことにそれは短期契約であり、部門はコストを削減するためにトリミングされたので、実際に学ぶ時間はありませんでした。

私は使い捨てのダミープロジェクトの単体テストに手を出しましたが、本格的なTDD / BDDについて頭を悩ませたことはありません。


2

それらを使用します。私たちが得る大きな利点の1つは、ユニットテストフレームワークがメモリリーク割り当てエラーをチェックすることです。問題は単体テストコード自体にある場合もありますが、多くの場合、プロダクションコードにあります。

コードレビューで見逃しているものを見つけるのに最適な方法です。

単体テスト(非常に高速)も実行する必要があり、コミットのたびに、また開発者がコミットする前に、継続的な統合の一部として実行できます。実行するのに20秒もかからない1,000を超えています。

システムレベルの自動化テストでは40分以上、手動テストでは数時間/日と比較してください。もちろん、単体テストは、実行する必要がある唯一のテストではありませんが、きめ細かいコードレベルでは、バグを見つけたり、システム/統合テストでは処理できないエッジケースをテストしたりできます。私たちのコードは、75%以上の意思決定カバレッジと100%の関数カバレッジでテストする必要があります。これは、単体テストなしでは達成するのが非常に困難です。


2

ユニットテストは価値を高めると思いますが、私はTDDの大弟子ではありません。計算エンジン、または実際にあらゆる種類のエンジンを実行するときにユニットテストを使用すると最も効果的で、ユーティリティクラスを使用すると、ユニットテストが非常に役立ちます。

より多くのデータ依存ブロックの自動統合テストを好むが、それはすべてデータビジネスに依存しているため、多くのエラーは私たちの環境で他の何よりもデータに関連しているため、自動統合テストはうまく機能している。これらのテストの前後にデータをチェックし、例外レポートを生成します。

したがって、特にテスト対象のユニットに必要なすべての入力を提供し、指定された入力で単独で動作できる場合、ユニットテストは本当に価値を高めます。繰り返しますが、私の場合、計算エンジンとユーティリティクラスはこれらの完璧な例です。


2

コスト:コーディングが遅い、学習曲線、開発者の慣性

利点:一般的に、最初にテストしたとき、より良いコードを書いていることに気づきました-賢明な...

しかし、私が思う最大の利点は、頻繁に変更される大規模システムの信頼性です。優れた単体テストは、複数のバージョンをリリースする際にお尻を節約し(鉱山を掘り下げました)、手動QAプロセスに関連する大きなコストを削減できます。もちろん、バグのないコードを保証するものではありませんが、予測が難しいコードをキャッチします。大規模で複雑なシステムでは、これは実際に非常に大きなメリットとなります。


0

機会があれば、職場で単体テストを行い、同僚にも同じことをさせるように説得します。

私はそれについては信心していませんが、経験は、ユニットの精巣であったユーティリティとビジネスの方法は非常に堅牢であり、テスト段階でバグがほとんどまたはまったく現れない傾向があることを示しています。これは最終的にプロジェクトのコストを削減します


0

ユニットテストをコーディングし、毎日のビルドプロセスの一部としてユニットテストの実行行うことの本当の利点を見たのは、 3つの異なる大陸で働く30人以上の開発者のプロジェクトでした。単体テストが本当に輝いたのは、誰かがそのクラスをどのように使用しているかを理解せずに、彼らが維持しているクラスを微妙に変更するときでした。コードがテストグループにヒットするのを待つ代わりに、変更の結果として他の人のユニットテストが失敗し始めたときに即座にフィードバックがありました。[だから、コード用に書いたものだけでなく、すべての単体テストを定期的に実行する必要があります。]

単体テストのガイドラインは次のとおりです。

  1. 悪い入力、境界など、コードについて考えられるすべての条件をテストします。
  2. すべてのモジュールのすべての単体テストは定期的に実行する必要があります(つまり、夜間ビルドの一部として)
  3. 単体テストの結果を確認してください!
  4. 誰かがあなたのコードをテスト中にバグを見つけた場合、そのための新しいテストを作成してください!

0

私は最近TDDを学び、それが非常に有用であることがわかりました。私のコードが期待どおりに動作しているという自信が得られます。私がやりたいリファクタリングを作成することに加えて。バグが見つかったときはいつでも、テストを通じてそれが再び表示されないことを確認できます。

最も難しいのは、適切な単体テストを作成することです。

これは、コードの優れたベンチマークです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.