天天看點

遊戲開發中更好的使用Unit Test

Technorati 标簽: Unit Test

作者:吳紫鄂([email protected])

測試驅動開發 test-driven development (TDD),在軟體開發中得到了越來越廣泛的推廣,在項目開發的早期重視QA的作用,正确的配置QA将帶來前所未有軟體品質保障。TDD真正的含義确往往被人們曲解,一個月前項目剛剛起步開始的時候屢次在規劃會議上強調TDD,但是時隔一個月,項目的部分子產品已經開始編碼的時候我卻發現大多數人所謂的測試(這裡隻涉及到程式員内部的白盒測試)還隻是停留在使用主觀臆斷和使用肉眼去觀察僅有的幾個測試用例,主要存在一下幾個誤區:

1、沒有統一的測試架構,沒有注重自動化測試:軟體測試不是像我們上學的時候那樣寫上一段代碼,然後随意的配上幾個可能的資料,觀察一下測試的結果就算測試,統一軟體過程更加講究測試的方法和自動化測試工具的使用,目前可以為遊戲開發直接使用的自動化測試工具似乎還沒有誕生,但是對于c++本身有很多的測試架構可以提供給我們進行測試夾具、自動化測試的輔助。《Exploring the C++ Unit Testing Framework Jungle 》一文中作者Noel Llopis提供了一個輕量級的Test Framework,并且比較了常見的c++單元測試架構,可以給我們帶來很大的啟發。

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unit++
  • CxxTest

    2、沒有完整的測試計劃,沒有完善的測試用例(Test Case):僅僅使用一時的主觀臆斷編寫幾個簡單的測試函數,或者更陀的是改變幾個預設的參數去使用肉眼觀察測試結果,這種事情是學生們幹的,對于一個職業程式員來講,一定要有一個測試優先的觀念,為我們寫的代碼提供能完整覆寫所有Case的測試路徑,即Test Case。而且像上面介紹的幾個Unit Test Framework都提供了測試夾具(Fixture)和測試包(Suite)的概念,可以使得我們能夠将我們的Test Case很好的歸檔,并且通過其通過的Setup和Teardown功能很好地進行自動化測試,至少是半自動化測試。Test Case的歸檔也為我們以後的維護提供了參考。

    3、測試不是一次性的:剛剛寫完代碼,又擠了點時間寫了幾個測試函數,運作一下沒有發現問題,測試完成……真是要命啦,測試怎麼可能是一次性的呢?測試不僅是要有完整的Test Case,而且在每次修改代碼之後都應該運作Test Case。

    4、測試結果的收集:測試結果也絕不是用肉用所能保證其正确性的,在功能比較少的情況下還能接受,當項目越來越龐大的時候,就必學使用上面提到的類似Unit Test Framework進行測試結果的收集,而且一般都提供能良好的Handles exceptions and crashes 機制。

    如果還不明白TDD那就找本最近兩年出版的軟體工程類的書籍看看,如果還在為Uint Test發愁那就都一下下面的參考資料的文章,如果還在做手動的機械的信賴肉眼的測試工作那就應該趕緊選一個适合自己的輕量級的Unit Test Framework更好地開始工作。總是必須使用自動化測試代替人腦工作。

    參考資料

    《Exploring the C++ Unit Testing Framework Jungle 》http://www.gamesfromwithin.com/articles/0412/000061.html

    《lists of what they wish for in C++ unit-testing frameworks》http://c2.com/cgi/wiki?ConsiderationsForAndComparisonOfCplusplusTestFrameworks