<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## **1.Go測試** Go語言中的測試依賴`go test`命名。在包目錄內,所有以`_test.go`為后綴名的源代碼文件都是`go test`測試的一部分,不會被`go build`編譯到最終的可執行文件中。 在`*_test.go`文件中有三種類型的函數、單元測試函數、基準測試函數和示例函數。 | 類型 |格式 |作用 | | --- | --- |--- | | 測試函數 | 函數名前綴為Test | 測試程序的一些邏輯行為是否正確| | 基準函數 | 函數名前綴為Benchmark |測試函數的性能 | | 示例函數 | 函數名前綴為Example | 為文檔提供示例文檔| `go test`命令會遍歷所有的`*_test.go`文件中符合上述命名規則的函數, 并生成一個臨時的main包用于調用相應的測試函數, 然后構建并運行、報告測試結果,最后清理測試中生成的臨時文件。 ~~~go func TestSplit(t *testing.T) { // 測試函數名必須以Test開頭,必須接收一個*testing.T類型參數 got := Split("a:b:c", ":") // 程序輸出的結果 want := []string{"a", "b", "c"} // 期望的結果 if !reflect.DeepEqual(want, got) { // 因為slice不能比較直接,借助反射包中的方法比較 t.Errorf("expected:%v, got:%v", want, got) // 測試失敗輸出錯誤提示 } } func TestMoreSplit(t *testing.T) { got := Split("abcd", "bc") want := []string{"a", "d"} if !reflect.DeepEqual(want, got) { t.Errorf("expected:%v, got:%v", want, got) } } ~~~ ``` go test // 執行 test文件 go test -v // 查看測試函數名稱和運行時間 go test -v -run="more" //-run參數對應正則表達式。 ``` ## **2.單元測試函數** 每個測試函數必須導入 `testing` 包,測試函數的基本格式(簽名)如下: ~~~go func TestName(t *testing.T){ // ... } ~~~ 測試函數的命名必須以`Test`開頭。 ``` // 其中 t 用于報告測試失敗和附加的日志信息。 func TestAdd(t *testing.T){ ... } func TestSum(t *testing.T){ ... } func TestLog(t *testing.T){ ... } ``` `go test`:在某一路徑下執行該命令,會運行該目錄下所有*_test.go文件。 `go test -v`:輸出完整的測試結果,能更好地在輸出結果中看到每個測試用例執行情況。 `go test -run=reg -v`:`-run`參數對應一個正則,只有函數名匹配上的測試函數才會被執行。 ## **3.跳過某些測試** 為了節省時間支持在單元測試時跳過某些耗時的測試用例。 ``` func TestTimeConsuming(t *testing.T) { if testing.Short() { t.Skip("short模式下會跳過該測試用例") } ... } ``` 當執行`go test -short`時就不會執行上面的`TestTimeConsuming`測試用例。 ## **4.子測試** 在Go1.7+新增了子測試,支持在測試函數中使用`t.Run`執行一組測試用例,這樣就不需要為不同的測試數據定義多個測試函數了。 ~~~go func TestXXX(t *testing.T){ t.Run("case1", func(t *testing.T){...}) t.Run("case2", func(t *testing.T){...}) t.Run("case3", func(t *testing.T){...}) } ~~~ ## **5.表格驅動測試** 表格驅動測試不是工具、包或其他任何東西,它只是編寫更清晰測試的一種方式和視角。 表格驅動測試可以涵蓋很多方面:表格里的每一個條目都是一個完整的測試用例,包含輸入和預期結果,有時還包含測試名稱等附加信息,以便于輸出易于閱讀。 使用表格驅動測試能夠很方便的維護多個測試用例,避免在編寫單元測試時頻繁的復制粘貼。 ## **6.并行測試** 在單元測試過程中使用并行測試,通過添加`t.Parallel()`來實現。 ## **7.使用工具生成測試代碼** gotests可以快速生成測試文件。 ``` go get -u github.com/cweill/gotests/... gotests -all -w split.go ``` ## **8.測試覆蓋率** 測試覆蓋率指代碼被測試套件覆蓋的百分比。 Go提供內置功能來檢查你的代碼覆蓋率,`go test -cover`來查看測試覆蓋率。 ![](https://img.kancloud.cn/8c/7a/8c7a13f6fcf2f549791b9f998257ba4a_578x123.png) Go還提供`-coverprofile`參數,用來將覆蓋率相關的記錄信息輸出到一個文件。 ``` go test -cover -coverprofile=c.out ``` 然后可以執行`go tool cover -html=c.out`,使用`cover`工具來處理生成的記錄信息,該命令會打開本地的瀏覽器窗口生成一個HTML報告。 ## **9.testify/assert** testify是一個流行的Go單元測試工具包,其中使用最多的功能就是它提供的斷言工具——`testify/assert`或`testify/require`。 **安裝** ``` go get github.com/stretchr/testify ``` 在寫單元測試時,通常需要使用斷言來校驗測試結果,由于Go官方沒有提供斷言,就會寫很多if...eles語句。而`testify/assert`為我們提供了很多常用的斷言函數,并且能夠輸出友好、易于閱讀的錯誤描述信息。 ``` t.Run(tt.name, func(t *testing.T) { // 使用t.Run()執行子測試 got := Split(tt.input, tt.sep) if !reflect.DeepEqual(got, tt.want) { t.Errorf("expected:%#v, got:%#v", tt.want, got) } }) // 簡化 t.Run(tt.name, func(t *testing.T) { // 使用t.Run()執行子測試 got := Split(tt.input, tt.sep) assert.Equal(t, got, tt.want) // 使用assert提供的斷言函數 }) ``` 當有多個斷言語句時,可以使用`assert := assert.New(t)`創建一個assert對象,它擁有前面所有的斷言方法,只是不需要再傳入`Testing.T`參數了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看