[心得] 單元測試相關心得:單元測試與軟體開發

分類: 軟體測試 作者: daniel

16 七月 2009

上週經過 Jace 介紹 PHPUnit 的教育訓練,稍微了解關於 PHP 在單元測試時,使用 PHPUnit 應該如何運用。雖然開場的時候有簡單解釋一下什麼是「單元測試」,但是因為小弟在下資質駑鈍,完全處於一種有聽沒有懂的狀態;所以後來 Wiki 了一下,才知道單元測試僅是複雜的軟體測試的一小部分,而軟體測試,又只是龐大的軟體開發中的一個環節而已!(暈)

在茫茫網海收集資料的過程中,又發現到「Continuous Integration」這個軟體開發時的一種專案管理方式,它也十分重視測試的重要性;同時整合統一的版本控管系統、以及配合開發人員的撰寫精巧易維護,低耦合性的程式碼、最後經由一定時間自動從版本控管系統把程式拉出來測試,自動 build,自動通知相關人員的全自動化處理,做最完善的軟體專案流程控管。聽起來感覺上是非常理想又完美的軟體開發方式!(夢幻?)

太過深入研究軟體開發,似乎會有一種沒完沒了的感覺...(囧)單純就「單元測試」來說,是對於程式最小單位的類別,針對其內部邏輯正確性的驗證;所以通常一個程式類別,就應該伴隨著一個針對該類別,檢驗其內部方法的測試類別。因為單元測試的特色:徹底性、可重複性、獨立性與專業性,讓需要經由大量資料測試的程式,透過單元測試的方式達到自動化,並有效減少正式上線後錯誤的發生,達到令程式變得更加完美的目的。

然而現實環境通常沒有辦法盡如人意,撰寫單元測試就意味著必須花費額外的工時,在一秒鐘幾十萬上下的台灣似乎是一件不可能的任務;更不用提那夢幻的軟體開發方式 Continuous Integration 了...這樣的現實狀況似乎有呼應到教育訓練結尾的結論:「小案子就放它一馬吧;對 Web 開發而言,一般的 CRUD 並沒有特別需要作測試」。

不過隨著網際網路的發達,Web 的開發好像也愈來愈複雜;在 Google 都放出 Google Operating System 的現在,愈來愈有一種「網路是充滿無限可能,實現夢想(我要成為網路王?)的最佳舞台」的感覺!或許在不久的將來,程式的困難度與複雜度,讓測試變的更加困難時,單元測試的導入會是很好的解決方案...吧?

P.S 另外對於教育訓練中提到的「測試先行開發模式」,我深深的感到困惑;如果說在開始撰寫程式碼前必須先寫測試,那單元測試中需要引入的類別要從何而來啊?不先寫程式類別,要怎麼做 Test case 呢?

參考資料:

3 Responses to [心得] 單元測試相關心得:單元測試與軟體開發

Avatar

Rafe

九月 24th, 2009 at 2:10 下午

其實Test Driven Development並不是專注於物件的Test

而是專注於物件的Behavior,也就是說

"在寫物件前先想好你要怎麼用(Test)他"

具體的方式是::

先寫TestCase(定義如何使用這個Class)

=>Test失敗(因為根本沒實做)

=>開始寫

=>直到Test成功

OK,現在你有一個可以用的Class,

還有描述他如何使用並保證它正常的TestCase了

然後重複上面的步驟,就是Test Driven Development了

Avatar

Rafe

九月 24th, 2009 at 2:15 下午

看了其他文章後發現以上都是贅文...

也從站長的分享中學習了不少

Avatar

chchwy

十月 18th, 2009 at 3:54 下午

測試先行的意義就是:
在開始撰碼之前,要求你先把類別的介面跟行為都思考清楚。
強迫你先站在「類別使用者」的立場來看事情。

若對於如何使用這個類別,只有薄弱的概念,那麼一定寫不出test case。

寫test case時,為了寫出好測的介面,你也同時在改善類別設計,強迫你對類別解耦(decouple)。好測就代表介面清楚,未來使用者也方便引用你寫的類別!

test case寫完之後,原類別只是個空殼,當然無法通過測試。

這時候才開始「實做」,一個接一個把test case解決掉,每解掉一個就就跑一次測試。等到test case全部通過的時候,就是實做完成的時候了。

此時你已經有了清楚的介面+無bug的強固程式碼。這才是unit test的真正精神所在。

我要留言

關於這裡

這個部落格分享了哇寶在電子商務領域的技術及資訊,希望能讓更多人一起為台灣的網路產業加油。