私は私のB.E(CS)に取り組んでいる学生であり、私の質問は次のとおりです。
私の質問:ソフトウェアのテストは必要ですか?
はい。どんなに上手であっても、すべてを考えることはできません。
シェフが料理しているのと同じ理由で。
私はこのような考えを持つ人と仕事をしていますが、彼は上級プログラマーであるため、コードをテストする必要がなくなったと考えています。同社はこの態度がどれほど危険であるかを理解しておらず、彼を完全に解雇する代わりに、バグのバックログに取り組むためにより多くのプログラマーを雇いました。このバックログがどこから来たのかわからないのは、それがプログラミングのすべての一部だと思っているからです。基本的に、このモードで作業する3人のプログラマと、これら3人が作成するバグをテストして修正する以外に何もしない20人のチームがあります。
[〜#〜]不在[〜#〜][〜#〜] of [〜#〜][ 〜#〜] proper [〜#〜] テスト [〜#〜] kills [〜#〜].
だからあなたがGODであるか、完全なすべての存在を知っている完璧なもの(今これが私が見たいと思っている)でない限り、またはあなたが積極的に非常に速く発砲したいのでなければ、私はテストを始めることを強く勧めます。
ソフトウェアは人々によって書かれています。
人々は不完全で間違いを犯します。
事業の複雑さが増すにつれて、ミス、見落とし、または忘れられたものの潜在的な数(および影響)が増加します-通常指数関数的に。
したがって、はい、テストが必要です。それはバランスと視点をもたらします。
ラップトップで使用していたOSを実行し、お気に入りの色で死の画面を表示するフライトに乗りますか?それについて考えてください。
完璧なコーダーはありません。遠く、遠く、遠く離れています。テストが必要です。テスターは、開発者が見逃していた視点(ユースケースとも呼ばれます)を取り込むことがよくあります。
Googleで最も有名なソフトウェアのバグを検索して、私が何を意味するかを知ってください。
大学レベルでは、テスト駆動開発、ユニットテスト、アジャイルプラクティスについて読んで、現在の状況を把握してください。
Errare humanum est
バグのないソフトウェアのようなものはありません。
最も熟練した開発者は、バグのあるコードを記述します。完璧な開発者が存在していても、次の不一致によりバグが発生する可能性があります。
完璧な開発者は、全体の一部にすぎません。そして、完璧な開発者は存在しません。
テストは、実際に使用される重要な(サイズ、または機能の)アプリケーションにとって絶対に必要です。 単一の開発者自分の技術に関心のある人(このサイトにアクセスしたことで証明される)は見つかりません。応答して、テストは必要ないと言うでしょう。
すでに投稿されているものに加えて、特定のアプリケーションで自動化された単体テストの完全なスイートがあると、将来のコード変更に自信を持つことができます。この高い信頼性(ユニットテストはBIGセーフティネットを提供するため)により、既存のアプリケーションへのコード変更が高速化されます(バックトラック/ダブルチェックが少ないため)。
他のすべてのすばらしい答えに加えて、完全でバグのないことがわかっていても、将来コードを処理する必要がある他のプログラマについて考えてください。彼らはあなたのようにそれを知らないでしょう、そして彼らが変更をした後に彼らが何も壊していないことを確実にするためにあなたのテストに依存したいと思うでしょう。もちろんこれは、1年もの間コードを見ていない場合にも当てはまります。
はい
以下は、まだ完全にはカバーされていないもう少し微妙な視点です。
「独立した検証」の必要性を過小評価しないでください。それは、数人の独立した編集者に、出版のために大量の執筆を提出する前にあなたの仕事を調べてもらうのが良いのと同じ理由です。あなたがどんなに優れた作家であっても、あなたは時々ブレインファートし、「それ」の代わりに「中」のようなものを書いたり、何かを書いたりします。あなたがそれを自分でもう一度読んだ場合、たとえ慎重に行っても、あなたの脳は思考プロセスの流れを正しいものとして自動的に受け入れ、エラーを隠してしまうので、通常は見逃します。新鮮な目で見ると、この種の間違いは通常かなり明白です。
プログラミングでも同じことがわかります。コードまたは独自のコードの基本的な「開発テスト」のフローに入るのは非常に簡単です。テストして特定の方法で使用しているため、正しく見えます。しかし、別のペアの手がやってきて、少し異なる方法または順序で物事をクリックすると、すべてがクラッシュします。
さて、もちろん、あなたはできます理論的には、コード内のすべての可能性と論理分岐をすべて正式に検証するルートをたどりますが、重要ではありませんソフトウェアは、誰かがコードを強打するよりもはるかに費用と時間がかかります。そして、あなたはおそらくあなたがまだ考えたことがないことを見逃すでしょう。
ほとんどの実際のプログラム:
a)数百行以上のコードが含まれ、多数のファイルに分散されている。
b)複数のプログラマによって開発されています。
c)開発者の環境とは異なる環境で使用されます
したがって、実際の状況でプログラムがどのように機能するかを確認しない場合、プログラムがまったく機能しない可能性は100%に近くなります。
まだ触れられていないこと:コードが完璧であっても、まだ安全ではありません。コンパイラにはバグがあり、完全なコードでもコンパイル後に正しく動作しない可能性があります。オペレーティングシステムにはバグがあり、実行時に完全なバイナリが正しく動作しない可能性があります。ハードウェアには、問題を引き起こす可能性のあるバグがあります。
これが、1台のマシンでのテストでは商用製品に十分ではない理由でもあります。それらは、実際に遭遇する可能性のあるハードウェアとソフトウェアの可能な限り多くの組み合わせの下でテストする必要があります。
スペースシャトルのソフトウェアを作成しているチームのリーダーは、ソフトウェアがシャトルに害を及ぼさないことを署名するために、すべての打ち上げの前に飛び立ちました。
彼にそうする自信を与えたと思いますか?
コードをコンパイルして使用するだけで、常にコードをテストしています。いくつかのIDEを入力すると、正常性チェックが行われます。実際にコードを実行しない限り、テストを行っています。
テストする量は、この種の質問の根本であり、その答えはリスクに帰着します。リスク管理の観点からテストするのが理にかなっている限り、テストします。すべてまたは何もテストすることは通常不可能です。何もないところをテストすることは、通常悪い動きです。その間のすべては、成果物のリスクレベルと露出に応じて、公平なゲームです。
宿題のようなにおいがします。
ソフトウェア分野でのテストは必要ですか?
はい。もちろんです。すべてのレベルで。いくつかの特殊なドメインの外では、数学的に証明できる段階ではまだありません(少なくとも、妥当な時間枠)、それで、それが壊れているかどうか、どこで壊れているかを確認するために、岩を投げる必要があります。
細心の注意を払ってソフトウェアを作成する場合、なぜテストする必要があるのでしょうか。
テストは、コーディングエラーを見つけることだけではありません。また、すべての要件を満たし、システム全体が期待どおりに動作することを確認することも目的です。失敗したトランザクションが特定のエラーコードを返す必要があるという要件がある場合、機能が存在することと正しく動作します。
そして、これらすべては、仕様と設計が完全で正確であり、内部的に一貫していることを前提としていますが、多くの場合そうではありません。文字どおりの仕様を満たし、最後のドットとセミコロンまでデザインに従っている場合でも、仕様またはデザインが悪いと、統合時に問題が発生します。多くの場合、システムまたは統合テストでは、仕様自体にバグがあり、修正が必要であることがわかります(以下のウォーストーリーを参照)。
テスト後、テストを行ったので、この目標を達成したことを確認できますか(製品/ソフトウェアは意図したとおりに機能します)。出来ますか?
いいえ、100%ではありません。入力または実行パスの考えられるすべての組み合わせを、最も単純なコード以外でテストすることはできません。すべての環境要因を説明することはできません。考えられるすべての障害モードを想像することはできません。
大きな問題がないことを確認して合理的にになるまでテストできます。ここでも、すべてのレベルでテストする必要があるのはこのためです。テストスイートを作成して、コードがEdge条件を正しく処理することを確認します(不正な入力、予期しない結果、例外など)。ユニットテストを実行して、コードが要件を満たしていることを確認します。エンドツーエンドの処理を確認するシステムテスト。すべてのコンポーネントが互いに正しく通信することを確認するための統合テスト。ユーザビリティテストを行って、顧客があなたを撃ちたくないような方法で全体が機能することを確認します。
現実のシナリオ-画面上のテーブルに表示するために、更新をGUIサービスに時々送信するバックエンドシステムで作業していました。プロジェクト中に、表示にフィルタリングを追加するための要件が追加されました(たとえば、オペレーターは、テーブル内のエントリーのサブセットを表示することを選択できます)。設計ミス#1-フィルタリングはGUIサービスによって行われるべきです(私はこの古風で古風な概念を持っていますが、ディスプレイ管理機能は、表示管理ソフトウェア)、しかし政治と私の問題がproblemsになる前に問題を認識できないため、その要件はバックエンドサービスに課されました。まあ、大丈夫、問題ありません、私はそれを行うことができます。状態の変化をフィルターし、メッセージを取得してから、作成または削除メッセージを送信します表の各行これは、インターフェイスの動作方法です(設計ミス#2-更新を送信する方法はありません)単一のメッセージの複数の行に;テーブル全体をクリアするために単一の「クリア」または「削除」メッセージを送信することさえできませんでした)。
まあ、開発中は何も問題なく動作します。ユニット、システム、および統合テストでは、正しい情報を送信し、フィルターの変更を正しく処理していることがわかります。次に、ユーザビリティテストを行います。データ量が圧倒的だったため、全体が落ちてしまいますhard。私のバックエンドサービスとGUIの間のネットワーク遅延は、0.15〜.25秒程度でした。 12行程度の更新のみを送信する必要がある場合は悪くありません。 Deadlyアップデートを数百回送信する必要がある場合。フィルターの状態を変更した後、GUIがフリーズするというバグレポートを取得し始めました。ええと、いいえ、何が起こっていたかというと、表示を更新するのに数分分かかっていたということです。 -一度にメッセージプロトコルは、実際のシナリオを処理できませんでした。
そのすべてが可能であり、shouldは、私たちが煩わしく思っていた場合、元請業者から小さな私まで、すべての人から予想されていたことに注意してください最も基本的な分析さえ事前に。私が提供する唯一の防御策は、納品後ほぼすぐにジャンクになる6か月のプロジェクトの2年目を締め切ることでした。そして、私たちは皆、その裏を見るために必死でした。
これが、テストする最後の理由-CYAです。現実のプロジェクトはさまざまな理由で失敗しますが、その多くは政治的な問題であり、問題が発生したときに誰もが誠実に行動するわけではありません。指が指摘され、非難が行われ、1日の終わりに、少なくともyourが機能したことを示すレコードを指すことができる必要があります想定通りでした。
優れたフォールトトレラントコンピューティングコースを受講することをお勧めします。ソフトウェアの注意深い設計は、ソフトウェア製品の堅牢性を実現するための柱の1つにすぎません。他の2つの柱は、十分なテストと冗長設計です。基本的な目的は、指数関数的な数の未知の障害状態に対応し、既知の障害のいくつかを優先的に処理することです。
1.)設計と適切な実装によって可能な限り多くの障害を排除する2.)さまざまな形式のテスト(ユニット、統合、ランダム)を通じて、設計フェーズと不正確な実装から予期しない障害を排除する3.)冗長性によって残った障害に対処する(時間的=>再計算、再試行、または空間的=>コピーを保持、パリティ)
テストフェーズを削除すると、障害に対処するための設計フェーズと冗長フェーズのみが残ります。
また、製品の観点から、利害関係者(経営陣、ユーザー、投資家など)は、製品が特定の品質と安全性の仕様、基準などを満たしていることを保証する必要があります。これ以外に、ソフトウェアをテストしていない「健全性チェック」のためだけに作成したのですか?これらすべての理由により、ソフトウェアのテストがより魅力的になります。
テストは常に行われ、バグは常に発見されます。それは、テストがチームによって内部で行われるか、エンドユーザーがテスターになるということです。エンドユーザーが発見したバグのコストは、テスト中に発見された場合よりも非常に高くなります。
すべてのプログラムには、少なくともそもそもバグがあります。
テストされていないコードの5行ごとに約1つのバグに収束するいくつかの研究があります。
歴史のレッスン:
1960年代に戻ると、IBMは実際にプログラムを実行せずにJCLの一部の機能を実行できるように、「NOP」プログラムを必要としていました。開発者は、コード全体がその名前「IEFBR14」内に含まれる1行のアセンブラプログラムを考え出しました。実際のコードは次のとおりです。
BR 14 * brach to return address in register 14
長いリフト期間中に、この1行のプログラムは2つのバグレポートと5つの修正の対象となりました。