自動テストの1つのことは、テスト可能にするためにコードを記述する必要があることです。これ自体は悪いことではありません(実際には、原則として回避すべき多くのプラクティスを思いとどまらせるので良いのですが)が、既存のコードに単体テストを適用しようとする場合はそうではありませんテスト可能な方法で書かれています。
シングルトン、静的メソッド、レジストリ、サービスロケーターなどのようなものは、モックアウトが非常に困難な依存関係を導入します。デメテルの法則への違反は、コードベースの他の部分がコードベースの他の部分がどのように機能するかについてあまりにも多くのことを知っていることを意味します。これらすべてのことにより、モジュールを他のコードベースから分離することが難しくなります。モジュールを分離してテストできない場合、ユニットテストは多くの価値を失います。テストが失敗した場合は、テスト対象のユニットの障害、またはその依存関係のいずれかの障害が原因であるか、依存データソースを介して引き込まれるデータがテスト作成者が予期したものではないことが原因である可能性があります?できれば'
ユニットテストを念頭に置いて構築されていないほとんどのコードベースは、本質的にテストできない傾向があります。 。単体テストを念頭に置いて記述されたコードは、非常に異なって見える傾向があります。
多くの人は、ユニットテストを初めて実行するときに素朴なアプローチを取ります。既存のコードベースのテストを大量に書くことができ、すべてがうまくいくと思いますが、上記の問題。彼らは、ユニットテストでセットアップを過度に実行しなければならないことを発見し始めます。また、コードに隔離がないため、テスト失敗の原因を突き止めることができないため、結果はしばしば疑わしいものです。彼らはまた、システムがどのように機能するかについての非常に抽象的な側面を示す「賢い」テストを書き始めようとする傾向があります。「賢い」単体テストはそれ自体がバグの潜在的な原因であるため、これは失敗する傾向があります。テストしたモジュールのバグが原因でテストが失敗しましたが、またはテストのバグのため?テストは非常に単純で、バグが潜んでいる可能性がないことは明らかです。実際、最高のテストは2行を超えることはめったにありません。最初の行はテスト対象のユニットに何かを行うように指示し、2行目はそれが期待したものであると断言します。
チームが単体テストの採用に真剣に取り組んでいる場合、既存のプロジェクトから始めるのは賢明ではありません。あなたのチームの既存のプロジェクトは、おそらく大きなリファクタリングなしではテストできません。単体テストについて学習するための基礎として新しいプロジェクトを使用したほうがよいでしょう。新しいコードベースを設計して、シングルトン、レジストリ、その他の隠れた依存関係よりも依存関係の注入を優先し、実装などではなくインターフェイスに依存するように記述できます。また、テストを実行するコードと一緒にテストを作成することもできます(テストを実行すると、テストするモジュールではなく、テストしたモジュールが意図したとおりに動作することを確認するユニットテストが実行されます)仕様書ですべきこと。
単体テストである程度の自信が得られると、チームはおそらく、単体テストの障害となる既存のコードの欠陥を認識し始めるでしょう。これは、既存のコードをリファクタリングしてよりテストしやすくするために作業を開始できるときです。野心的で一度にこれをやろうとしたり、まったく新しいシステムで動作するシステムを置き換えようとしないでください。簡単にテストできるコードベースの一部を見つけてから始めてください。依存関係または依存関係が明らかな場所)およびそれらのテストを記述します。コードと一緒にテストを書くことは、後でテストを書くことよりも望ましいと言いましたが、後で書かれたテストでさえ出発点として価値があります。クラスがどのように動作するかについて、その仕様が行うべきだと言うこと以外は何も知らないかのようにテストを記述します。テストを実行して失敗した場合、仕様または実装が間違っています。両方を再確認してどちらが間違っているかを判断し、それに応じてテストまたはコードを更新します。
ぶら下がっている果物を選んだら、あなたの本当の仕事が始まります。コードベース内の非表示の依存関係を見つけて、一度に1つずつ修正する必要があります。この時点で野心的にならないでください。テストの障害が修正され、次のビットに進むまで、一度に1つのモジュールを実行するか、1つのモジュールで1つの問題だけを実行してください。
TL:DR:ほとんどの人はテストが簡単だと思っているので、既存のコードにテストを簡単に後付けできます。これらの仮定はどちらも間違っています。これらの両方の事実を念頭に置いて、プロジェクトにユニットテストを組み込むプロジェクトに着手すると、成功する可能性が高くなります。