2009-03-04 67 views
1

我一直在閱讀關於TDD的內容,並希望將其用於我的下一個項目,但我不確定如何使用這種新範例構建我的類。我想使用的語言是Java,但問題並不是特定於語言的。設備通信器的TDD

項目

我有硬件的幾件拿出一個ASCII-過RS232接口。我可以發出簡單的命令,並獲得簡單的響應,並像從前面板一樣控制它們。每個人都有一個稍微不同的語法和非常不同的命令集。我的目標是創建抽象/接口,以便我可以通過GUI和/或遠程過程調用來控制它們。

的問題

我認爲第一步是創建一個抽象類(我壞名,怎麼樣「通訊」?)來實現所有喜歡串行I/O的東西,然後爲每個設備創建一個子類。我相信它會比這更復雜一些,但這是我腦海中應用程序的核心。

現在,對於單元測試,我不認爲我真的需要實際的硬件或串行連接。我想要做的是將我的Communicators作爲一個InputStream和OutputStream(或Reader和Writer),它可以來自串口,文件,stdin/stdout,從測試函數傳送,不管。那麼,我是否只需將Communicator構造函數作爲輸入?如果是這樣,將責任全部放在測試框架上很容易,但對於真正的人來說,誰來建立真正的連接呢?一個單獨的構造函數?函數再次調用構造函數?一個單獨的課程是將Communicator「連接」到正確的I/O流的工作?

編輯

我正要改寫問題部分爲了得到答案,我想我是問這個問題,但我想我想通了。我(正確地?)確定了兩個不同的功能區域。

1)與所述設備(理解其輸出&生成命令)

幾個月前通信的串行端口

2)處理,我會它全部合併成一個類。我第一個想擺脫這種情況的想法是將IO流傳遞給理解設備的類,我無法弄清楚誰將負責創建流。

已經做了更多的控制反轉研究,我想我有答案。有一個單獨的接口和類來解決問題#1並將其傳遞給解決問題#2的類(es?)的構造函數。這樣,分開測試都很容易。 #1連接到實際的硬件,並允許測試框架做不同的事情。 #2可以通過給予#1的模擬來測試。

這聽起來合理嗎?我需要分享更多信息嗎?

+0

您將使用什麼操作系統來構建和運行測試?這在生產中是否會一樣? – 2009-03-04 06:34:14

回答

2

隨着TDD,你應該讓你的設計出現,從嬰兒的步驟開始小,並通過測試,一點一點地增長你的課堂測試。

CLARIFIED:從一個具體的類開始,發送一個命令,單元測試它與模擬或存根。當它足夠工作(可能不是所有選項)時,請對照您的真實設備進行一次測試,以驗證您的模擬/存根/模擬器。

一旦第一個命令的類可操作,開始執行第二個命令,同樣的方法:首先再次你的模擬/存根,然後一次針對設備進行驗證。現在,如果你看到兩個類之間有相似之處,你可以重構你的基於抽象類的設計 - 或者不同的東西。

2

對不起,我是一個小的Linux中心..

我的模擬小玩意喜歡的方式是write character device drivers模仿他們的行爲。這也給你提供了很多有趣的功能,比如提供一個ioctl()接口,使仿真設備的行爲異常。

在這一點上......從測試到現實世界,只關心您實際打開,讀取和寫入的設備。

模仿你的小工具的行爲不應該太難......聽起來他們會採取非常基本的指令並返回非常基本的迴應。再次,一個簡單的ioctl()可以告訴模擬設備它的時間行爲不當,所以你可以確保你的代碼充分處理這些事件。例如,故意在每個第n條指令上失敗,其中n是在調用ioctl()時隨機選擇的。

+0

這看起來像一個好主意,除了現在一切都是Windows(但是Java應該是可移植的......對吧?)。但是,這看起來可能正是我未來項目所需要的。你在Linux上編寫驅動程序有沒有其他的好資源(我在Google上可能找不到)? – 2009-03-11 07:48:43

1

在看到您的編輯後,我認爲您正朝着正確的方向前進。 TDD傾向於推動你採用由小班組成的設計,並有明確的責任。我也會迴應tinkertim的建議 - 您可以控制和「激發」以不同方式運行的設備模擬器對測試非常有用。