錯誤處理,除錯和測驗
我們經常會看到很多程式員大部分的"編程"時間都花費在檢查bug和修復bug上,無論你是在撰寫修改代碼還是重構系統,幾乎都是花費大量的時間在進行故障排除和測驗,外界都覺得我們程式員是設計師,能夠把一個系統從無做到有,是一項很偉大的作業,而且是相當有趣的作業,但事實上我們每天都是徘徊在排錯、除錯、測驗之間,當然如果你有良好的習慣和技術方案來直面這些問題,那么你就有可能將排錯時間減到最少,而盡可能的將時間花費在更有價值的事情上,
但是遺憾的是很多程式員不愿意在錯誤處理、除錯和測驗能力上下工夫,導致后面應用上線之后查找錯誤、定位問題花費更多的時間,所以我們在設計應用之前就做好錯誤處理規劃、測驗用例等,那么將來修改代碼、升級系統都將變得簡單,
錯誤處理
Go語言主要的設計準則是:簡潔、明白,簡潔是指語法和C類似,相當的簡單,明白是指任何陳述句都是很明顯的,不含有任何隱含的東西,在錯誤處理方案的設計中也貫徹了這一思想,我們知道在C語言里面是通過回傳-1或者NULL之類的資訊來表示錯誤,但是對于使用者來說,不查看相應的API說明檔案,根本搞不清楚這個回傳值究竟代表什么意思,比如:回傳0是成功,還是失敗,而Go定義了一個叫做error的型別,來顯式表達錯誤,在使用時,通過把回傳的error變數與nil的比較,來判定操作是否成功,
錯誤處理
Go在錯誤處理上采用了與C類似的檢查回傳值的方式,而不是其他多數主流語言采用的例外方式,這造成了代碼撰寫上的一個很大的缺點:錯誤處理代碼的冗余,對于這種情況是我們通過復用檢測函式來減少類似的代碼,
在程式設計中,容錯是相當重要的一部分作業,在Go中它是通過錯誤處理來實作的,error雖然只是一個介面,但是其變化卻可以有很多,我們可以根據自己的需求來實作不同的處理
使用GDB除錯
開發程式程序中除錯代碼是開發者經常要做的一件事情,Go語言不像PHP、Python等動態語言,只要修改不需要編譯就可以直接輸出,而且可以動態的在運行環境下列印資料,當然Go語言也可以通過Println之類的列印資料來除錯,但是每次都需要重新編譯,這是一件相當麻煩的事情,我們知道在Python中有pdb/ipdb之類的工具除錯,Javascript也有類似工具,這些工具都能夠動態的顯示變數資訊,單步除錯等,不過慶幸的是Go也有類似的工具支持:GDB,Go內部已經內置支持了GDB,所以,我們可以通過GDB來進行除錯,那么本小節就來介紹一下如何通過GDB來除錯Go程式,
另外建議純go代碼使用delve可以很好的進行Go代碼除錯
GDB除錯簡介
GDB是FSF(自由軟體基金會)發布的一個強大的類UNIX系統下的程式除錯工具,使用GDB可以做如下事情:
啟動程式,可以按照開發者的自定義要求運行程式,
可讓被除錯的程式在開發者設定的調置的斷點處停住,(斷點可以是條件運算式)
當程式被停住時,可以檢查此時程式中所發生的事,
動態的改變當前程式的執行環境,
目前支持除錯Go程式的GDB版本必須大于7.1,
編譯Go程式的時候需要注意以下幾點
傳遞引數-ldflags "-s",忽略debug的列印資訊
傳遞-gcflags "-N -l" 引數,這樣可以忽略Go內部做的一些優化,聚合變數和函式等優化,這樣對于GDB除錯來說非常困難,所以在編譯的時候加入這兩個引數避免這些優化,
Go怎么寫測驗用例
開發程式其中很重要的一點是測驗,我們如何保證代碼的質量,如何保證每個函式是可運行,運行結果是正確的,又如何保證寫出來的代碼性能是好的,我們知道單元測驗的重點在于發現程式設計或實作的邏輯錯誤,使問題及早暴露,便于問題的定位解決,而性能測驗的重點在于發現程式設計上的一些問題,讓線上的程式能夠在高并發的情況下還能保持穩定,本小節將帶著這一連串的問題來講解Go語言中如何來實作單元測驗和性能測驗,
Go語言中自帶有一個輕量級的測驗框架testing和自帶的go test命令來實作單元測驗和性能測驗,testing框架和其他語言中的測驗框架類似,你可以基于這個框架寫針對相應函式的測驗用例,也可以基于該框架寫相應的壓力測驗用例,那么接下來讓我們一一來看一下怎么寫,
gotest_test.go:這是我們的單元測驗檔案,但是記住下面的這些原則:
- 檔案名必須是_test.go結尾的,這樣在執行go test的時候才會執行到相應的代碼
- 你必須import testing這個包
- 所有的測驗用例函式必須是Test開頭
- 測驗用例會按照源代碼中寫的順序依次執行
- 測驗函式TestXxx()的引數是testing.T,我們可以使用該型別來記錄錯誤或者是測驗狀態
- 測驗格式:func TestXxx (t *testing.T),Xxx部分可以為任意的字母數字的組合,但是首字母不能是小寫字母[a-z],例如Testintdiv是錯誤的函式名,
- 函式中通過呼叫testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,說明測驗不通過,呼叫Log方法用來記錄測驗的資訊,
如何撰寫壓力測驗
壓力測驗用來檢測函式(方法)的性能,和撰寫單元功能測驗的方法類似,此處不再贅述,但需要注意以下幾點:
-
壓力測驗用例必須遵循如下格式,其中XXX可以是任意字母數字的組合,但是首字母不能是小寫字母
func BenchmarkXXX(b *testing.B) { ... } -
go test不會默認執行壓力測驗的函式,如果要執行壓力測驗需要帶上引數-test.bench,語法:-test.bench="test_name_regex",例如go test -test.bench=".*"表示測驗全部的壓力測驗函式
-
在壓力測驗用例中,請記得在回圈體內使用testing.B.N,以使測驗可以正常的運行
-
檔案名也必須以_test.go結尾
我們可以看到testing包很輕量,撰寫單元測驗和壓力測驗用例非常簡單,配合內置的go test命令就可以非常方便的進行測驗,這樣在我們每次修改完代碼,執行一下go test就可以簡單的完成回歸測驗了,
這也許對于你撰寫程式邏輯沒有任何幫助,但是對于你撰寫出來的程式代碼保持高質量是至關重要的,因為一個好的Web應用必定有良好的錯誤處理機制(錯誤提示的友好、可擴展性)、有好的單元測驗和壓力測驗以保證上線之后代碼能夠保持良好的性能和按預期的運行,
鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49410.html
標籤:Go
上一篇:goweb- 國際化和本地化
