これが私がTDDプログラミングを行う方法です。最初に、追加する必要がある新しい機能を確立し、次に、この機能が持つすべての外部依存関係を確立します。たとえば、現在のプロジェクトには、使用しているモデルに関する情報を提供する ac api への依存関係があります。クライアントは、私が応答しなければならないコマンドを入力できるため、コマンド ラインにも依存しています。このコマンド ラインは特別な端末を介して実行されますが、その詳細は私には関係ありません。
そのため、これらの外部依存関係のインターフェイス クラスを作成し、これらのインターフェイスのみをコードで使用します。その結果、テストを行うときに、モデルの c++ ライブラリや端末の c++ ライブラリは必要ありません (これについては後で詳しく説明します)。コマンド ラインに書き込むためのインターフェイスの例を次に示します。
class ICommandLineOutput
{
public:
virtual void WriteLine(std::string&) = 0;
};
それで、時間をコマンド ラインに書き込む WriteTime というクラスを作成するように依頼されたとします。次に、 ICommandLineOutput型のオブジェクトをこのクラス コンストラクターに渡し、このインターフェイスでのみ動作します。使用しているコマンド ラインの種類は気にしません。そのインターフェイスだけです。ICommandLineOutput クラスをベースとして持つ限り、任意のコマンド ライン クラスを使用できます。
class WriteTime
{
public:
explicit WriteTime(ICommandLineOutput commandLine): _commandLine(commandLine){}
...
};
そのため、単体テストを行うときは、作成した各クラスをテストする別の C++ プロジェクトを作成します。このプロジェクトは Google Test を使用でき、コマンド ライン プロジェクトにすることができます。したがって、GUI C++ プロジェクトに含まれる GUI アプリケーションを作成している場合でも、テストには独自のプロジェクトがあります。
コマンドラインに時間を書き込むクラスをテストしたいとしましょう。これは、TestWriteTime というクラスで行います。GoogleMock を使用して、ICommandLineOutput インターフェイスのモックを作成します。次に、WriteTime が期待どおりに動作しているかどうかを確認するために、テスト ベースによるテストでモックを調べたり、構成したりできます。たとえば、WriteLine() が呼び出された回数と受け取るパラメーターを確認できます。
最後に、現在のプロジェクトでは、大量の依存関係を持つ Linux ベースのプロジェクトを扱っています。アプリケーションの起動にも時間がかかります。ただし、テストを行う Windows コンソール プロジェクトがあります。このアプリケーションは、TDD に最適な 1 秒未満で実行されます。