私はTDDについて読んできましたが、私の次のプロジェクトで使ってみたいと思いますが、この新しいパラダイムでクラスをどのように構築するのかは分かりません。私が使用したい言語はJavaですが、問題は実際には言語固有ではありません。デバイスコミュニケーターのTDD
プロジェクト
私はASCIIオーバーRS232インターフェースが付属してハードウェアのいくつかの作品を持っています。私は簡単なコマンドを発行し、簡単な応答を得ることができ、フロントパネルのようにコントロールすることができます。それぞれの構文はわずかに異なり、非常に異なるコマンドセットを持っています。私の目標は抽象化/インタフェースを作成して、GUIやリモートプロシージャコールを通してそれらをすべて制御できるようにすることです。
問題
私は、最初のステップは、シリアルI/Oのようなすべてのものを実装するための抽象クラスを(私はどのように「コミュニケータ」について、名前で悪いんだ?)を作成することであると信じて、各デバイスのサブクラスを作成します。私はそれがもう少し複雑になると確信していますが、それは私の心の中でアプリケーションの核心です。
ユニットテストでは、実際のハードウェアやシリアル接続が本当に必要ないと思います。私がしたいのは、私のコミュニケータにシリアルポート、ファイル、stdin/stdout、テスト関数からパイプされたInputStreamとOutputStream(またはReaderとWriter)を渡すことです。だから、私はCommunicatorのコンストラクタにそれらを入力として受け取るだけですか?もしそうなら、それをテストフレームワークにすべて設定するのは簡単ですが、実際の人は誰ですか?別のコンストラクタ?コンストラクタを再度呼び出す関数ですか?コミュニケータを正しいI/Oストリームに「接続」することは、別のクラスの担当者ですか?
編集
私は私が求めていたと思った質問への答えを得るために、問題の部分を書き換えることを約あったが、私はそれを考え出したと思います。私は(正確には)2つの異なる機能領域を特定していました。
数ヶ月前に、その出力&生成コマンドを理解するデバイス()との通信シリアルポート
2)への対応
1)が、私は1つのクラスにそれをすべて組み合わせただろう。これを解消するための私の最初のアイデアは、IOストリームだけをデバイスを理解するクラスに渡すことでした。誰がストリームを作成する責任を負っているのか分かりませんでした。
制御の逆転についてより多くの研究を行ったところ、私はと答えました。答えです。問題#1を解決し、問題#2を解決するクラスのコンストラクタ(es?)に渡す別のインターフェイスとクラスを用意してください。そうすれば、両方を別々にテストするのは簡単です。実際のハードウェアに接続し、テストフレームワークが異なることを可能にすることで、#1を達成しました。 #2は#1の模擬試験を受けることでテストすることができます。
これは合理的ですか?より多くの情報を共有する必要がありますか?
テストのビルドと実行にはどのオペレーティングシステムを使用しますか?これは本番で同じですか? –