天天看點

實踐TDD的點滴——如何寫好TODO

我覺得TDD入手最重要的一個環節的就是對TODO的分解,每條TODO最終都能分析到一定的可測試的粒度,否則很難轉化成測試代碼。在TDD的幾本書中,似乎TODO是輕而易舉的事,但往往在具體項目中卻讓人不知如何下手。書上的例子大多都是一些純邏輯的問題,而具體的項目往往都是資料庫,UI,網絡同邏輯混雜一起。而此也造成了大多TDD推行的流産。我是從事網絡多媒體相關開發,在項目團隊中推行TDD,發現幾乎所有的開發人員TODO都不知道如何細化分解,是以我在這裡通過一個具體的例子把我的分解列出來。

項目描述:

這是一個監控相關的項目。有多個現場,每個現場都有多個攝像頭,用戶端可以監控各個現場,同一個現場也可以從各個角度監控。用戶端可以同時有多個視訊視窗,每個現場都可以獨立選擇綁定的現場和綁定的錄影機位。

[b]業務需求:[/b]

[table]

|使用者可以選擇不同的錄影機位觀看現場。|

[/table]

[b]系統需求分解:[/b]

[table]

|a)使用者從下拉條選擇要檢視的視訊機位,選擇後在對應的視窗播放視訊。|

|b)由于可能有多個視窗在看視訊,本視窗選擇的視訊可能另一個視窗已經在播放了,是以確定同一個機位視訊隻訂閱一次。|

|c)記得要清除原有訂閱的視訊。|

|d)如果視訊所在的伺服器不同需要建立新的連接配接。如果另的視窗的視訊源同一個服務位址,則隻用一個連接配接。|

[/table]

[b]個人觀點:[/b]系統需求分解就是将業務需求結合開發環境、架構、性能、對象生命期管理的進一步分解。

[b]TODO:[/b]

[table]

|1. (不測)切換下拉事件:如果沒有機位沒變化則不改變目前狀态|

|2. (不測)切換下拉事件:如果機位發生變化,取消視窗同舊的視訊流的綁定|

|3. (不測)切換下拉事件:如果機位發生變化,建立視窗同新的視訊流的綁定|

|4. (要測)建立視窗同視訊機位的綁定:如果該機位視訊已經有其它的視窗訂閱了,那麼無需重新訂閱,直接使用原有訂閱,添加該視訊訂閱合約同視窗的關系。|

|5. (要測)建立視窗同視訊機位的綁定:如果該機位視訊還未訂閱過,那麼進行訂閱。|

|6. (要測)訂閱機位視訊:建立或取得同該視訊源的通路代理對象,訂閱機位所在通道的視訊流。|

|7. (要測)建立或取得同該視訊源的通路代理對象:如果視訊源所在的代理對象已經存在,直接傳回|

|8. (要測)建立或取得同該視訊源的通路代理對象:如果視訊源所在的代理對象不存在,則建立,并取得同該伺服器的連接配接,将該代理對象放入連接配接中。|

|9. (要測)取得同該伺服器的連接配接:如果連接配接存在,直接傳回|

|10. (要測)取得同該伺服器的連接配接:如果連接配接不存在,則建立一個新的連接配接|

|11. (要測)取消視窗同舊的視訊流的綁定:從訂閱的節點中,移除本視窗|

|12. (要測)取消視窗同舊的視訊流的綁定:如果訂閱節點中的所有綁定視窗都清空了,則真正向視訊源取消對應通道視訊流的訂閱。并清除視訊源的通路代理。|

|13. (要測)清除視訊源的通路代理:如果代理所在的連接配接器沒有任何其它代理,則斷開并清除連接配接|

[/table]

[b]個人觀點:[/b]由于1、2、3涉及到MFC的視窗控件調用,測試麻煩,固不進行測試。

[b]個人觀點:[/b]由于涉及的問題較複雜,是以TODO也是采用逐層挖掘的方式,如:

切換下拉事件

建立視窗同視訊機位的綁定

如果該機位視訊已經有其它的視窗訂閱了

如果該機位視訊還未訂閱過

訂閱機位視訊

建立或取得同該視訊源的通路代理對象

如果視訊源所在的代理對象已經存在

如果視訊源所在的代理對象不存在

取消視窗同舊的視訊流的綁定

從訂閱的節點中,移除本視窗

如果訂閱節點中的所有綁定視窗都清空了

清除視訊源的通路代理

[b]個人觀點:[/b]由于TDD是驅動設計,而不是保障接口的有效性測試,而此可以去測試一些private的函數。如何測private,不同語言不同,我是用c++,采用friend方式就可以。

以上是我的一些思路,純粹是個人在項目中的摸索,還請大家共同指教。另外我覺得不同的軟體開發,會有一些各自适用的經驗,大家也可以一起貼出來交流學習。