1. ホーム
  2. java

[解決済み] なぜテストにJUnitを使うのか?

2022-06-30 22:24:24

疑問点

初歩的な質問かもしれませんが、どのような状況で junit ?

シンプルなアプリケーションを書く場合でも、より大きなアプリケーションを書く場合でも、私はそれらを System.out ステートメントでテストしています。

JUnitでテストクラスを作成し、プロジェクト内に不要なフォルダを作成し、それでも同じメソッドを呼び出し、それらが返すものをチェックしなければならず、さらにすべてにアノテーションを付けるというオーバーヘッドがあるのはなぜでしょうか?

なぜクラスを書いて System.out でテストすればいいのに、Test-classを作らないのはなぜ?

PS. 私は大規模なプロジェクトに取り組んだことがありません、私はちょうど学んでいます。

では、目的は何なのでしょうか?

どのように解決するのか?

それはテストではなく、quot;looking manually at output" (業界では LMAO と呼ばれています)です。より正式には、「異常な出力を手動で探す」(LMFAO) といいます。 (以下の注を参照)

コードを変更するときはいつでも、アプリを実行し、それらの変更によって影響を受けるすべてのコードに対して LMFAO を行う必要があります。小さなプロジェクトであっても、これは問題であり、エラーが発生しやすいものです。

今度は 50k、250k、1m LOC またはそれ以上にスケールアップして、コードを変更するときはいつでも LMFAO しなければなりません。不快なだけでなく、不可能です。入力、出力、フラグ、条件の組み合わせをスケールアップし、すべての可能な分岐を行使することは困難です。

さらに悪いことに、LMFAO は何ページもの Web アプリにアクセスし、レポートを実行し、何十ものファイルやマシンにまたがる何百万ものログ行に目を通し、生成および配信されたメールを読み、テキストメッセージをチェックし、ロボットのパスをチェックし、ソーダのボトルを入れ、100 の Web サービスからデータを集約し、金融取引の監査証跡をチェックする...ということを意味します。 出力とは数行のテキストではなく、集合体システムの挙動を意味するのです。

最後に、ユニットテストとビヘイビアテスト を定義します。 システムの挙動を定義します。テストは継続的インテグレーション サーバーによって実行され、正しさをチェックすることができます。もちろん System.out しかし、CIサーバーはそれらのうちの1つが間違っているかどうかを知るつもりはありませんし、もしそうなら、それらはユニットテストであり、フレームワークを使う方がよいでしょう。

私たちがどんなに優秀だと思っていても、人間は優秀なユニットテストフレームワークやCIサーバーではありません。


注:LMAO のテストをしていますが、その中で は非常に という限られた意味でのテストです。プロジェクト全体またはプロセスの一部として、意味のある方法で繰り返し行うことはできません。これは、REPL でインクリメンタルに開発しながらも、それらのインクリメンタルのテストを決して形式化しないことに似ています。