以前はそれがなかったコードベースにユニットテストを導入しました。私がこれに携わった最後の大きなプロジェクトで、チームに到着したとき、製品はすでにユニットテストなしで生産されていました。私が去ったとき-2年後-4500以上のテストが行われ、230 000以上の生産LOC(リアルタイムの金融Win-Formsアプリケーション)のコードベースで約33%のコードカバレッジが得られました。低く聞こえるかもしれませんが、その結果、コードの品質と欠陥率が大幅に向上し、さらに士気と収益性も向上しました。
これは、関係者からの正確な理解とコミットメントの両方がある場合に実行できます。
まず、単体テストはそれ自体がスキルであることを理解することが重要です。「従来の」標準によって非常に生産性の高いプログラマでありながら、大規模なプロジェクトで拡張できる方法で単体テストを作成するのに苦労する場合があります。
また、特にあなたの状況では、テストのない既存のコードベースに単体テストを追加することも、それ自体が専門的なスキルです。あなたやあなたのチームの誰かがユニットコードを既存のコードベースに導入することに成功した経験がない限り、Featherの本を読むことは必須です(オプションではなく、強くお勧めしません)。
コードの単体テストへの移行は、コードベースの品質と同じくらいの人とスキルへの投資です。これを理解することは、考え方や期待を管理する上で非常に重要です。
今、あなたのコメントと質問のために:
ただし、全体像を見逃してしまい、最初からTDDを使用した場合に含まれていたはずの基本的なテストを見落としてしまうのではないかと心配しています。
短い答え:はい、あなたはテストを逃します、そしてはい、彼らは最初にグリーンフィールドの状況で彼らがするであろうもののように見えないかもしれません。
より深いレベルの答えはこれです:それは問題ではありません。テストなしで開始します。テストの追加を開始し、必要に応じてリファクタリングします。スキルレベルが向上したら、プロジェクトに追加されたすべての新しく記述されたコードの基準を引き上げ始めます。等を改善していきます...
さて、ここの行間を読んでいると、これは「行動を起こさない言い訳としての完璧」という考え方から来ているという印象を受けます。より良い考え方は、自己信頼に焦点を当てることです。まだ方法がわからない場合があるので、空欄に記入する方法を理解します。したがって、心配する必要はありません。
繰り返しますが、そのスキル。1つの「プロセス」または「ステップバイステップ」のクックブックアプローチで線形テストの方法でゼロテストからTDD完全に移行することはできません。プロセスになります。あなたの期待は、漸進的かつ漸進的な進歩と改善をすることでなければなりません。魔法の薬はありません。
良いニュースは、数か月(場合によっては数年)が経過するにつれて、コードが徐々に適切に因数分解され、十分にテストされた「適切な」コードになることです。
補足として。古いコードベースでユニットテストを導入する際の主な障害は、結束の欠如と過度の依存関係であることがわかります。したがって、最も重要なスキルは、実際の単体テスト自体を作成するのではなく、既存の依存関係を切り離してコードを分離する方法になることでしょう。
既存のソリューションが適切に単体テストされており、単に組み込まれているだけではないことを保証するために、遵守すべきプロセス/ステップはありますか?
すでにそれがない場合は、ビルドサーバーをセットアップし、コードカバレッジ付きのすべての単体テストを含むすべてのチェックインで実行される継続的インテグレーションビルドをセットアップします。
あなたの人々を訓練します。
どこかから始めて、顧客の視点から進歩を遂げている間にテストを追加し始めます(以下を参照)。
コードカバレッジは、プロダクションコードベースのどの程度がテストされているかのガイドリファレンスとして使用します。
ビルド時間は常に高速である必要があります。ビルド時間が遅い場合、単体テストのスキルが遅れています。遅いテストを見つけて改善します(本番用コードを分離して個別にテストします)。よく書かれているので、数千の単体テストを簡単に実行でき、10分未満でビルドを完了することができます(1〜数ms /テストは良いですが、非常に大まかなガイドラインです。リフレクションを使用するコードなどのいくつかの例外が適用される場合があります) )。
検査して適応します。
テストが高品質であり、テストのケースだけではないことをどのようにして確認できるかをテストなしよりも優れています。
あなた自身の判断があなたの現実の第一の情報源でなければなりません。スキルを置き換えることができる指標はありません。
その経験や判断力がない場合は、そうした人と契約することを検討してください。
2つの大まかな二次的な指標は、合計コードカバレッジとビルド速度です。
運用中の既存のソリューションに取り組む価値はありますか?
はい。カスタムビルドのシステムまたはソリューションに費やされる費用の大部分は、本稼働に投入された後に費やされます。また、品質、人、スキルへの投資は時代遅れにならないようにしてください。
このプロジェクトのテストを無視し、将来の可能性のある書き換えで追加する方が良いでしょうか?
人とスキルへの投資だけでなく、最も重要なことには、システムの総所有コストと予想される寿命を考慮する必要があります。
私の個人的な答えは、大抵の場合「はい」です。私はそれが非常に良いことを知っているためですが、例外があるかもしれないことを認識しています。
より有益になるもの; 数週間かけてテストを追加したり、数週間かけて機能を追加したりしますか?
どちらでもない。あなたのアプローチは、機能面で進歩している間、コードベースにテストを追加することです。
繰り返しになりますが、これは人、スキル、およびコードベースの品質への投資であり、そのため時間もかかります。チームメンバーは、依存関係を破る方法、単体テストを書く方法、新しいハビッツを学ぶ方法、規律と品質の認識を向上させる方法、ソフトウェアをより適切に設計する方法などを学ぶ必要があります。これらのスキルはまだ、そのアプローチを成功させるために必要なレベルにあるため、多くのテストを追加するためにすべての時間を費やすために進行を止めることは、単に機能しません。
また、任意のサイズのプロジェクトサイズの既存のコードベースに単体テストを追加することは、コミットメントと永続性を必要とする大きな作業です。基本的なものを変更することはできません。途中で多くの学習を期待し、ビジネス価値の流れを停止することでROIを期待しないようにスポンサーに依頼することはできません。それは飛ばないでしょうし、率直に言って飛べないはずです。
3つ目は、チームに健全なビジネスフォーカスの価値を浸透させることです。品質は顧客を犠牲にすることは決してなく、品質なしで速く行くことはできません。また、顧客は変化する世界に住んでいます。あなたの仕事は、顧客が適応しやすくすることです。顧客の調整には、品質とビジネス価値の流れの両方が必要です。
あなたがしていることは技術的な負債を返済することです。そして、常に変化するニーズに対応しながら、そうするのです。徐々に借金が返済されると状況が改善し、顧客により良いサービスを提供し、より多くの価値を提供することが容易になります。このポジティブな勢いは、持続可能なペースの原則を強調し、開発チーム、顧客、および利害関係者の両方にとってモラルを維持および改善するため、あなたが目指すべきものです。
それが役に立てば幸い