C で記述された大規模なマルチプラットフォーム アプリケーションがあります (C++ の量は少ないですが増加しています)。これは、大規模な C/C++ アプリケーションに期待される多くの機能を備えて、何年にもわたって進化してきました。
#ifdef
地獄- テスト可能なコードの分離を困難にする大きなファイル
- 複雑すぎて簡単にテストできない関数
このコードは組み込みデバイスを対象としているため、実際の対象で実行するには多くのオーバーヘッドがかかります。そのため、ローカル システム上で、短いサイクルでより多くの開発とテストを行いたいと考えています。ただし、「システムの .c ファイルにコピー/貼り付け、バグを修正し、コピー/貼り付けを戻す」という従来の戦略は避けたいと考えています。開発者がわざわざそれを行うのであれば、後で同じテストを再作成し、自動化された方法で実行できるようにしたいと考えています。
ここに問題があります。コードをリファクタリングしてよりモジュール化するには、コードをよりテストしやすくする必要があります。しかし、自動化された単体テストを導入するには、よりモジュール化する必要があります。
1 つの問題は、ファイルが非常に大きいため、適切な単体テストを作成するためにスタブ化する必要がある同じファイル内の関数を呼び出す関数がファイル内にある可能性があることです。私たちのコードがよりモジュール化されるにつれて、これはそれほど問題ではないように思えますが、それはまだ先の話です。
私たちが考えたことの 1 つは、「テスト可能であることがわかっている」ソース コードにコメントをタグ付けすることでした。次に、テスト可能なコードのソース ファイルをスキャンするスクリプトを作成し、それを別のファイルにコンパイルして、単体テストにリンクします。欠陥を修正し、機能を追加するにつれて、ゆっくりと単体テストを導入することができます。
ただし、このスキームを (必要なすべてのスタブ関数と共に) 維持するのが面倒になり、開発者が単体テストの維持をやめるという懸念があります。したがって、別のアプローチは、すべてのコードのスタブを自動的に生成するツールを使用し、それとファイルをリンクすることです。(これを実行できる唯一のツールは、高価な商用製品です) しかし、このアプローチでは、外部呼び出しのみをスタブ化できるため、開始する前にすべてのコードをよりモジュール化する必要があるようです。
個人的には、開発者には外部の依存関係について考えてもらい、独自のスタブをインテリジェントに作成してもらいたいと考えています。しかし、10,000 行にも及ぶ恐ろしく大きくなりすぎたファイルのすべての依存関係をスタブ化するには、これは非常に困難な作業になる可能性があります。すべての外部依存関係のスタブを維持する必要があることを開発者に納得させるのは難しいかもしれませんが、それは正しい方法ですか? (私が聞いたもう 1 つの議論は、サブシステムのメンテナーがサブシステムのスタブを維持する必要があるというものです。しかし、開発者に独自のスタブを作成することを「強制」することが、より良い単体テストにつながるのではないでしょうか?)
もちろん、これ#ifdefs
は問題に別の次元全体を追加します。
いくつかの C/C++ ベースの単体テスト フレームワークを見てきましたが、適切に見える多くのオプションがあります。しかし、「単体テストのないコードの毛玉」から「単体テスト可能なコード」への移行を容易にするものは見つかりませんでした。
それで、これを経験した他の人への私の質問は次のとおりです。
- 良い出発点は何ですか?私たちは正しい方向に進んでいますか、それとも明らかな何かが欠けていますか?
- 移行に役立つツールは何ですか? (現在の予算はほぼ「ゼロ」なので、できれば無料/オープン ソース)
ビルド環境は Linux/UNIX ベースであるため、Windows 専用のツールは使用できないことに注意してください。