Web 開発における単体テストの使用についてお聞きしたいと思います。単体テストのアイデアは素晴らしいですが、Web アプリケーションのコンテキストで本当に価値があるのでしょうか? 私の質問の 2 番目の部分は、TDD についてです。実際のコードの前に統合テストを作成する場合、このアプローチを「テスト駆動開発」と呼ぶことができますか?
1.前提
定義により、単体テストは 1 つのサービス レイヤーのみでコードをテストする必要があります。テストが複数のレイヤーにわたってコードをテストする場合、統合テストがあります。
2. 引数
2.1 アルゴリズムなし
Web アプリケーションには多くのアルゴリズムはありません。これは、すべてのメソッドが挑戦的でデバッグが困難なことを行う 3D 物理エンジンを構築するようなものではありません。Web アプリケーションは、主に HTML の統合と生成に関するものです。
Web アプリケーションの最大の課題は次のとおりです。 - クリーンなコード (どのソフトウェアにも共通する問題ですが、テストできません) - データの一貫性 - 統合 (プログラミング言語、ファイル システム、構成ファイル、Web サーバー、キャッシング システム、データベース、検索エンジン、外部 API - これらすべてのシステムは、要求に応じて連携する必要があります)
Web アプリのすべてのクラスの単体テストを作成する場合は、(ほとんどの場合) テストを行います: 配列の入力、文字列の連結、および言語のネイティブ関数。
2.2 コスト
Web アプリは統合がすべてであるという理由だけで、常に複数の依存関係があります。多くの異なるクラスをモックする必要があり、小さなテストを作成するだけでも実際には大きな仕事になる場合があります。さらに悪いことに、それはテストだけではありません。ソフトウェアはテスト可能である必要があります。これは、ほぼすべてのクラスに依存関係を注入できる必要があることを意味します。2 つのクラス (またはシステム) 間に追加のレイヤーを作成せずに依存関係を挿入できるとは限りません。コードが複雑になり、作業コストが高くなります。
3. 統合テスト
Web 開発のすべてが統合である場合、それをテストしてみませんか? 反論は少ない。
3.1 統合テストで「何かが壊れている」と表示されるが、どこに問題があるかは表示されない
コードを「UnitTestable」にしてより複雑にするのに必要な時間と比較して、統合テストが失敗したときにバグを見つけるのにどれくらいの時間がかかりますか (これは主観的なものだと思います)。私の経験では、問題の原因を見つけるのに時間はかかりませんでした。
3.2 単体テストはどの環境でも実行できるが、統合テストでは難しい
はい、データベースなしで統合テストを実行する場合。通常、データベースがあります。各テストの後にデータを修正してクリーンアップする限り、問題はありません。トランザクション データベースは、このタスクに最適です。トランザクションを開き、データを挿入し、テストし、ロールバックします。
3.3 統合テストは保守が難しい
私のテストはすべてうまく機能し、問題は一度もなかったので、それについてコメントすることはできません。
4. 優れた単体テストを作成する!
議論全体は、「ユニットテストを正しく作成すれば、問題はありません」と攻撃することができます. それは統合テストでも同じではないでしょうか? 統合テストを作成する方が簡単な場合は、それに固執して正しく作成しないのはなぜですか?
誤解しないでほしいのですが、私は単体テストに反対しているわけではありません。それは完璧なアイデアであり、私は皆にお勧めします. 私は理解しようとしています: それは本当に Web 開発に適していますか? 感想や体験談をお聞きしたいです。