第十一章 測試
Maurice Wilkes,第一個存儲程序計算機EDSAC的設計者,1949年他在實驗室爬樓梯時有一個頓悟。在《計算機先驅回憶錄》(Memoirs of a Computer Pioneer)裡,他回憶到:“忽然間有一種醍醐灌頂的感覺,我整個後半生的美好時光都將在尋找程序BUG中度過了”。肯定從那之後的大部分正常的碼農都會同情Wilkes過分悲觀的想法,雖然也許會有人困惑於他對軟件開發的難度的天真看法。
現在的程序已經遠比Wilkes時代的更大也更復雜,也有許多技術可以讓軟件的複雜性可得到控制。其中有兩種技術在實踐中證明是比較有效的。第一種是代碼在被正式部署前需要進行代碼評審。第二種則是測試,也就是本章的討論主題。
我們說測試的時候一般是指自動化測試,也就是寫一些小的程序用來檢測被測試代碼(產品代碼)的行為和預期的一樣,這些通常都是精心設計的執行某些特定的功能或者是通過隨機性的輸入待驗證邊界的處理。
軟件測試是一個巨大的領域。測試的任務可能已經佔據了一些程序員的部分時間和另一些程序員的全部時間。和軟件測試技術相關的圖書或博客文章有成千上萬之多。對於每一種主流的編程語言,都會有一打的用於測試的軟件包,同時也有大量的測試相關的理論,而且每種都吸引了大量技術先驅和追隨者。這些都足以說服那些想要編寫有效測試的程序員重新學習一套全新的技能。
Go語言的測試技術是相對低級的。它依賴一個go test測試命令和一組按照約定方式編寫的測試函數,測試命令可以運行這些測試函數。編寫相對輕量級的純測試代碼是有效的,而且它很容易延伸到基準測試和示例文檔。
在實踐中,編寫測試代碼和編寫程序本身並沒有多大區別。我們編寫的每一個函數也是針對每個具體的任務。我們必須小心處理邊界條件,思考合適的數據結構,推斷合適的輸入應該產生什麼樣的結果輸出。編寫測試代碼和編寫普通的Go代碼過程是類似的;它並不需要學習新的符號、規則和工具。