6

私は現在、他の 1 人の生協の学生と一緒に、完成間近のプロジェクトに取り組んでいる生協の学期にいます。このプロジェクトは生協から生協へと受け継がれてきたため、途中で悪い慣行が取られ、最後までテストが行​​われました。テスト中に何か新しいことを学ぶために、単体テストを書きたいと思いました。

ただし、現在の形式では単体テストが不可能と思われる 3 層の密結合アプリに取り組んでいます。一晩で認識できないほどコードをリファクタリングすることで、これらの概念の知識がない他の生協の学生を捨てたくはありません。では、コードをゆっくりと単体テスト可能にするには、どのような手順を踏む必要がありますか? 最初にファクトリ パターンを実装し、先に進む前に他の生徒にそれを理解してもらう必要がありますか?

私の知識に欠陥があり、何の問題もない場合はお詫び申し上げます。私はこれが初めてです:)

4

4 に答える 4

7

Michael Feathers によるレガシー コードの効果的な作業

ファクトリ パターンの実装が有効かどうかを判断するのは困難です。コードが何を行っているかによって異なります :)

于 2009-06-19T13:26:53.263 に答える
2

Michael Feathers 著の Working Effectively with Legacy Code (サブスクリプションをお持ちの場合は Safari でも利用可能) は、タスクに最適なリソースです。著者は、レガシー コードを単体テストのないコードと定義し、コードをテスト対象にするための多くの保守的な手法 (セーフティ ネットなしで作業しているために必要) の実践的なウォークスルーを提供します。目次:

  • パート: I 変化の力学
    • 第 1 章 ソフトウェアの変更
      • ソフトウェアを変更する 4 つの理由
      • 危険な変化
    • 第 2 章 フィードバックの操作
      • 単体テストとは
      • 高レベルのテスト
      • テストカバー
      • 従来のコード変更アルゴリズム
    • 第3章 感知と分離
      • 偽の協力者
    • 第4章 Seam モデル
      • 巨大なテキストシート
      • 継ぎ目
      • 縫い目の種類
    • 第5章 ツール
      • 自動リファクタリング ツール
      • モック オブジェクト
      • 単体テスト ハーネス
      • 一般的なテスト ハーネス
  • パート: II ソフトウェアの変更
    • 第6章 時間があまりなく、変えなければならない
      • スプラウト法
      • スプラウトクラス
      • ラップ方法
      • ラップクラス
      • 概要
    • 第7章 変化を起こすには永遠に時間がかかる
      • 理解
      • 時間差
      • 依存関係を壊す
      • 概要
    • 第 8 章機能を追加するにはどうすればよいですか?
      • テスト駆動開発 (TDD)
      • 差によるプログラミング
      • 概要
    • 第9章 このクラスをテストハーネスに入れることができません
      • いらいらするパラメータのケース
      • 隠された依存関係の場合
      • コンストラクション ブロブの場合
      • イライラするグローバルな依存関係の事例
      • 恐ろしいインクルード依存関係のケース
      • Onion パラメータのケース
      • エイリアス パラメータのケース
    • 第10章 テストハーネスでこのメソッドを実行できない
      • 隠しメソッドの場合
      • 「役立つ」言語機能の事例
      • 検出できない副作用の事例
    • 第11章 私は変更を加える必要があります。どのメソッドをテストする必要がありますか?
      • 効果についての推論
      • 前向きな推論
      • 効果の伝播
      • 効果推論のためのツール
      • 効果分析から学ぶ
      • エフェクト スケッチの簡素化
    • 第 12 章 1 つの領域で多くの変更を行う必要があります。関連するすべてのクラスの依存関係を解除する必要がありますか?
      • 傍受ポイント
      • ピンチポイントでデザインを判断する
      • ピンチポイントトラップ
    • 第13章 変更を加える必要があるが、特性化テストを作成するためのテストがわからない
      • クラスの特徴付け
      • 対象を絞ったテスト
      • 特性評価テストを作成するためのヒューリスティック
    • 第14章 ライブラリへの依存が私を殺している
    • 第15章 私のアプリケーションはすべて API 呼び出しです
    • 第16章 コードを変更するほどよく理解していない
      • メモ/スケッチ
      • リストのマークアップ
      • スクラッチリファクタリング
      • 未使用のコードを削除
    • 第17章 アプリケーションに構造がありません
      • システムのストーリーを語る
      • ネイキッドCRC
      • 会話精査
    • 第18章 テストコードが邪魔
      • クラス命名規則
      • テスト場所
    • 第19章 私のプロジェクトはオブジェクト指向ではありません。安全な変更を行うにはどうすればよいですか?
      • 簡単なケース
      • ハードケース
      • 新しい動作の追加
      • オブジェクト指向の活用
      • すべてオブジェクト指向です
    • 第20章 このクラスは大きすぎて、これ以上大きくしたくない
      • 責任を見る
      • その他のテクニック
      • 前進する
      • クラス抽出後
    • 第21章 いたるところで同じコードを変更しています
      • 最初のステップ
    • 第22章 モンスターメソッドを変更する必要があり、そのためのテストを書くことができません
      • モンスターの種類
      • 自動リファクタリングのサポートによるモンスターへの取り組み
      • 手動リファクタリングの課題
      • ストラテジー
    • 第23章 何も壊していないことをどのように知ることができますか?
      • ハイパーアウェア編集
      • 単一目標の編集
      • 署名を保持
      • コンパイラに頼る
    • 第24章 私たちは圧倒されます。これ以上良くなることはない
  • パート: III 依存関係を壊すテクニック
    • Chapter 25. 依存関係を壊すテクニック
      • アダプト パラメータ
      • Break Out メソッド オブジェクト
      • 定義補完
      • グローバル参照をカプセル化する
      • 静的メソッドを公開
      • 呼び出しの抽出とオーバーライド
      • ファクトリ メソッドの抽出とオーバーライド
      • Getter の抽出とオーバーライド
      • 抽出実装者
      • インターフェイスの抽出
      • インスタンス委任者の紹介
      • 静的セッターの導入
      • リンク置換
      • コンストラクターのパラメーター化
      • Parameterize メソッド
      • プリミティブ化パラメータ
      • プルアップ機能
      • プッシュダウンの依存関係
      • 関数を関数ポインタに置き換える
      • グローバル参照をゲッターに置き換える
      • サブクラスとオーバーライド メソッド
      • インスタンス変数を置き換える
      • テンプレートの再定義
      • テキストの再定義
  • 付録: リファクタリング
    • 抽出方法
于 2009-06-19T13:44:06.300 に答える
1

プロジェクトの途中で新しい開発手法を開始するのは非常に困難です。以前、最初から単体テストを行っていないプロジェクトに取り組んだとき、「新しいコードには単体テストが必要である」というルールを設定することをお勧めしますが、単体テストに圧力をかけないでください。古いコード用に書かれています。

もちろん、プロジェクトの構造がテスト容易性に適していない場合、これも困難です。

私の最善の推奨事項は、小さなステップでそれを行うことです.

テストを含まない単体テスト アセンブリ (またはプロジェクトなど) を作成することから始めます。次に、かなり明確に定義され、区切られた小さなコード領域を 1 つ見つけ、その領域の単体テストをいくつか記述します。ココーダーにも見てもらい、コードがチェックインされるたびに単体テストを実行するなど、いくつかの「ベストプラクティス」を開始してください(可能であれば自動的に)。

それが機能したら、ゆっくりと追加を開始できます。

ゆっくりがポイントです。そして、私が言ったように、最初から古いコードをテストから除外する方が簡単です。チームが単体テストの概念を理解し、それをより上手に記述できるようになったら、後でいつでもそれに戻ることができます。

于 2009-06-19T13:23:42.880 に答える
1

コード内の主要な機能について、一連のブラック ボックス テストを作成するのはどうでしょうか。ASP.NET プロジェクトだとおっしゃっていたので、 WaitNSeleniumなどのフレームワークを使用して Web ブラウザーを自動化できます。これにより、コードがどれだけ変更されても変わらない機能のベースライン セットが得られます。

プロジェクトの高レベルの機能をテストする十分な数のテストを取得したら、コードに飛び込み始めます。Simon P. Stevens が言及しているように、ゆっくりと作業します。Refactorの (無料!) コピーを手に入れましょう! Visual Basicの場合、Extract Method などの基本的なリファクタリングを自動的に実行できます。より大きなコードのチャンクをより小さく、よりテストしやすいチャンクに分割するだけで、機能を変更することなくテスト容易性を大幅に向上させることができます。

于 2009-06-19T13:39:01.257 に答える