G01學習筆記-5

zcold發表於2021-05-19

閱讀位置8.2

知識點

1、測試

知名的第三方測試包 github.com/stretchr/testify/assert

1.1 測試檔案標識:

字尾名 _test 告知 Go 編譯器和工具鏈這是一個測試檔案 Go 編譯器在編譯時會跳過這些檔案

1.2 cmd 執行(專案目錄下)

go test ./測試檔案目錄

  • -v 顯示詳細資訊
  • -count=1 測試的次數,官方推薦的清除快取的方式
1.3 testify 的常用斷言函式:
//assert.
// 相等
func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool
func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool
// 是否為 nil
func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool
func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool
// 是否為空
func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool
func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool
// 是否存在錯誤
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool
// 是否為 0 值
func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool
func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool
// 是否為布林值
func True(t TestingT, value bool, msgAndArgs ...interface{}) bool
func False(t TestingT, value bool, msgAndArgs ...interface{}) bool
// 斷言長度一致
func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool
// 斷言包含、子集、非子集
func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool
func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool)
func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool)
// 斷言檔案和目錄存在
func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool
func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool
1.4 testing.T

混臉熟

// 獲取測試名稱
method (*T) Name() string
// 列印日誌
method (*T) Log(args ...interface{})
// 列印日誌,支援 Printf 格式化列印
method (*T) Logf(format string, args ...interface{})
// 反饋測試失敗,但不退出測試,繼續執行
method (*T) Fail()
// 反饋測試失敗,立刻退出測試
method (*T) FailNow()
// 反饋測試失敗,列印錯誤
method (*T) Error(args ...interface{})
// 反饋測試失敗,列印錯誤,支援 Printf 的格式化規則
method (*T) Errorf(format string, args ...interface{})
// 檢測是否已經發生過錯誤
method (*T) Failed() bool
// 相當於 Error + FailNow,表示這是非常嚴重的錯誤,列印資訊結束需立刻退出。
method (*T) Fatal(args ...interface{})
// 相當於 Errorf + FailNow,與 Fatal 類似,區別在於支援 Printf 格式化列印資訊;
method (*T) Fatalf(format string, args ...interface{})
// 跳出測試,從呼叫 SkipNow 退出,如果之前有錯誤依然提示測試報錯
method (*T) SkipNow()
// 相當於 Log 和 SkipNow 的組合
method (*T) Skip(args ...interface{})
// 與Skip,相當於 Logf 和 SkipNow 的組合,區別在於支援 Printf 格式化列印
method (*T) Skipf(format string, args ...interface{})
// 用於標記呼叫函式為 helper 函式,列印檔案資訊或日誌,不會追溯該函式。
method (*T) Helper()
// 標記測試函式可並行執行,這個並行執行僅僅指的是與其他測試函式並行,相同測試不會並行。
method (*T) Parallel()
// 可用於執行子測試
method (*T) Run(name string, f func(t *T)) bool

2、重構

專案目錄結構

go 沒有明確的目錄推薦

在實際 Go 專案開發中,要靈活運用,不需要太糾結於某個目錄應該怎麼設計。以專案的大小、業務的複雜度、個人及團隊專業技能認知的廣度和深度、時間的緊迫度為準。不一定要選最好的,而是要選擇最適用的方案。

Go 社群裡推薦閱讀下這個專案 —— golang-standards/project-layout

注意迴圈引用!!!
  1. main 包裡面引入 goblog/pkg/route ,呼叫 route.Initialize 進行路由初始化;
  2. goblog/pkg/route 裡 Initialize 函式載入了 goblog/routes 註冊路由 routes.RegisterWebRoutes(Router);
  3. goblog/routes 包里載入了控制器的包 goblog/app/http/controllers
  4. 控制器包裡再次使用了路由工具包 goblog/pkg/route !!出現迴圈引用問題了!!

我的理解:main包引用的專案自身寫的包,不能被其他包使用,需獨立出來,只供main包呼叫

  • 貴在堅持,保持進步
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章