進む
この質問をする前に、SEに関する多くの関連する質問を含め、多くのことを読みました。
- (ソフトウェアエンジニアリングSE)目的がわからないコードのテストを書く
- (ソフトウェアエンジニアリングSE)ユニットテスト初心者チームはユニットテストが必要
- (ソフトウェアエンジニアリングSE)レガシーコードを自動テストで改造するためのベストプラクティス
- (ソフトウェアエンジニアリングSE)大規模なレガシーシステムを単体テストする方法
- (ブログ投稿)単体テスト環境をモックアップする方法
しかし、助けを求めて読んだ後、かゆみはまだ引っかかれていないと感じざるを得ません。
TL; DR
実行、シミュレーション、読み取り、または簡単に理解できないレガシーコードの単体テストを作成するにはどうすればよいですか?おそらく意図したとおりに機能するコンポーネントに役立つ回帰テストは何ですか?
全体像
私は大学院に移行しているので、再び夏の帰国研修生です。私の仕事には次の要件が含まれます。
- 特定の製品について、ソフトウェアチームが既存のプロジェクトとの互換性を失うことなくIDEおよびJUnitバージョンをアップグレードできるかどうかを評価します。
- 既存のJavaコード(主にJavaではない)の一部のコンポーネントの単体テストを開発します。ユニットテストとTDDは、使用する必要がある非常に貴重なツールであることをソフトウェアチームに納得させたいと思います。(現在、0%のコードカバレッジがあります。)
- どういうわけか、重要なシステムのカウボーイコーディングの時代を終わらせてください。
ソースコードのコピーを入手した後、この製品の機能と動作を理解できるように、ビルドして実行しようとしました。できませんでした。私は上司に自分のやり方を尋ね、実際に機能するビルドスクリプトを含む、それをビルドできる新しいスタンドアロンマシンを発行されました。彼らの予想通り、製品コードは設計された組み込みシステムでのみ実行されるため、それも機能しませんでした。しかし、彼らはこの目的のためにシミュレーターを持っているので、彼らはシミュレーターを手に入れ、このマシンにそれを置いてくれました。シミュレータも機能しませんでした。代わりに、私は最終的に特定の画面のGUIのプリントアウトを受け取りました。また、700,000以上のJava LOC内のどこにもコードコメントがないため、把握がさらに困難になります。さらに、彼らのプロジェクトが新しいIDEと互換性があるかどうかを評価する問題がありました。特に、彼らのコードは、彼らが使用しているまさにそのIDEバージョンに適切にロードされませんでした。
私の在庫は次のようになっています:
- NetBeans 8、9、10、11
- JUnit 4、5
- 特定の製品のソースコード(700,000以上のJava LOCを含む)
- 実質的にコードコメントはありません(場合によっては署名)
- 既存のテストはありません
- GUIウィンドウの物理的な写真
- 画像内のコンポーネントについて説明していないソフトウェア設計ドキュメント(109ページ)
少なくとも理論的には実行可能なテストを書くのに十分です。そこで、このコンポーネントについて基本的な単体テストを試しました。しかし、モデル、マネージャー、DB接続など、依存関係として持つオブジェクトを初期化できませんでした。基本的な単体テスト以外にJUnitの経験はあまりないので、次のセクションに進んでください。
私の読書から学んだこと
- モッキング:単体テストを作成する場合、本番環境での依存関係のために、モック変数を用意する必要があります
setUp
。 - ここの誰もがマイケルフェザーズの著書「レガシーコードを効果的に使用する」を寛大に提案しています。
- 回帰テストは、おそらく開始するのに適しています。統合テストを試すのに十分な兵器がないと思います。回帰テストは、ソフトウェアチームにすぐに満足感を与えるでしょう。ただし、私は彼らの既知のバグにアクセスできません。しかし、私はたぶん尋ねることができました。
そして今、私がまだ疑問として持っている不確実性を明確にする試み。基本的に、私はこれらのテストを作成する方法の一部を理解していません。(おそらく)上司からこれ以上のガイダンスを受け取らないと想定すると、このコンポーネントの機能を理解するだけでなく、どのテストが回帰テストとして実際に役立つかを判断するのは私の球場です。
このようなプロジェクトに携わってきた専門家として、このような状況で単体テストを作成する方法について何かアドバイスはありますか?
How do I write unit tests for legacy code that I can't build, run, simulate, read about, or otherwise understand?
-できません。少なくとも、特定の入力に対して期待される出力が何であるかを知っている必要があります。