qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Go語言學習]之一:搭建單元測試環境

           最近開始正式的學習Go語言,奉行我學習一項新技術的步驟和原則( 筆記 + 單元測試 + demo )。首先學習了開發環境的配置,并立即搭建了單元測試的環境,這樣可以一邊寫筆記,一邊進行測試和學習,從而加強理解。

            這里簡單介紹Go中的測試環境搭建方法,大家可以參考著搭建并測試學習。

            Go中的測試方式

            Go語言中自帶有一個輕量級的測試框架(testing) 和 go test 命令來實現單元測試、性能測試 和 示例。一般來說,一個 xxx.go 文件對應的 xxx_test.go 文件就是其對應的單元測試文件,往往在同一個目錄下(參見 %GOROOT%\src\pkg 下的各文件)。

            _test.go中有三種測試方式(具體可以參見 go help testfunc ):

          1.單元測試, 代碼示例為:
            func TestXxx(t *testing.T) {
              單元測試代碼, 通過 t.Error 等實現斷言
            }
          2.性能測試,代碼示例為:
            func BenchmarkXxx(b *testing.B) {
              for i := 0; i < b.N; i++ {
                目標代碼,會重復運行N次
              }
            }
          3.示例 -- 代碼示例為:
            func ExampleXxx() {
              示例語句,往標準輸出中輸出信息,然后下面會通過 Output 的注釋指明會輸出的文字,框架會進行比較
              //Output: 示例輸出
            }

            針對本人的學習筆記需要,當前情況下只使用單元測試來記錄各種學習筆記。

            下面是我針對切片(Slice)的測試代碼,從中可以驗證文檔中說的一些重要信息,比如:可隨時動態增減元素,擴充時會重新分配并復制內存(類似于 std::vector) 等

          func TestSlice(t *testing.T) {
           //方法1:直接創建一個保存有10個整數的slice
           intSlice := make([]int, 10, 15) //{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
           for idx := 0; idx < len(intSlice); idx++ {
            intSlice[idx] = idx + 1
           }
           GOUNIT_ASSERT(t, len(intSlice) == 10, "make創建的slice長度")
           GOUNIT_ASSERT(t, cap(intSlice) == 15, "make創建的slice容量")

           //從尾端向數組切片中追加元素
           newIntSlice := append(intSlice, 11, 12, 13)
           GOUNIT_ASSERT(t, len(intSlice) == 10, "append后原來的Slice不變")
           GOUNIT_ASSERT(t, len(newIntSlice) == 13, "append后新的Slice")
           GOUNIT_ASSERT(t, cap(newIntSlice) == 15, "cap(newIntSlice) == 15")
           GOUNIT_ASSERT(t, &newIntSlice != &intSlice, "append返回新的切片")
           GOUNIT_ASSERT(t, &newIntSlice[0] == &intSlice[0], "底層的數組是同一個")

           newIntSlice[0] = 99
           GOUNIT_ASSERT(t, newIntSlice[0] == intSlice[0], "未進行內存擴充的情況下新舊Slice指向同一個底層數組")

           newAddressIntSlice := append(intSlice, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
           GOUNIT_ASSERT(t, cap(newAddressIntSlice) == 30, "擴充后的長度,目前實現采用容量翻倍的方式")
           newAddressIntSlice[0] = 199
           GOUNIT_ASSERT(t, &newAddressIntSlice[0] != &intSlice[0], "進行了內存擴充,底層數組不再一樣")
           GOUNIT_ASSERT(t, newAddressIntSlice[0] != intSlice[0], "進行了內存擴充,底層數組不再一樣")

           //方法2:先創建一個array,然后基于該array創建slice
           intArray := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
           intSliceFromArray := intArray[0:5] //[:]--基于全部元素, [5:]--從第5個元素開始的所有元素
           GOUNIT_ASSERT(t, len(intSliceFromArray) == 5, "array[n:m]創建的slice長度")
           GOUNIT_ASSERT(t, cap(intSliceFromArray) == 10, "array[n:m]創建的slice容量")
           GOUNIT_ASSERT(t, cap(intArray) == 10, "數組的容量")

           //下面代碼會在運行時拋出"index out of range"的異常(panic) -- 因為該slice長度是5(即0~4)
           //intSliceFromArray[5] = 10

           //在slice后追加slice,注意最后的三個點
           S3 := append(newIntSlice, intSliceFromArray...)
           GOUNIT_ASSERT(t, len(S3) == 18 && cap(S3) == 30, "在slice后追加slice")

           //copy函數,如兩個切片不一樣大,會按照較小的切片的元素個數進行復制
           var newS = make([]int, 3)
           nCopy := copy(newS, intSlice[0:5])
           GOUNIT_ASSERT(t, nCopy == 3, "只復制3個元素")
          }

           最近開始正式的學習Go語言,奉行我學習一項新技術的步驟和原則( 筆記 + 單元測試 + demo )。首先學習了開發環境的配置,并立即搭建了單元測試的環境,這樣可以一邊寫筆記,一邊進行測試和學習,從而加強理解。

            這里簡單介紹Go中的測試環境搭建方法,大家可以參考著搭建并測試學習。

            Go中的測試方式

            Go語言中自帶有一個輕量級的測試框架(testing) 和 go test 命令來實現單元測試、性能測試 和 示例。一般來說,一個 xxx.go 文件對應的 xxx_test.go 文件就是其對應的單元測試文件,往往在同一個目錄下(參見 %GOROOT%\src\pkg 下的各文件)。

            _test.go中有三種測試方式(具體可以參見 go help testfunc ):

          1.單元測試, 代碼示例為:
            func TestXxx(t *testing.T) {
              單元測試代碼, 通過 t.Error 等實現斷言
            }
          2.性能測試,代碼示例為:
            func BenchmarkXxx(b *testing.B) {
              for i := 0; i < b.N; i++ {
                目標代碼,會重復運行N次
              }
            }
          3.示例 -- 代碼示例為:
            func ExampleXxx() {
              示例語句,往標準輸出中輸出信息,然后下面會通過 Output 的注釋指明會輸出的文字,框架會進行比較
              //Output: 示例輸出
            }

            針對本人的學習筆記需要,當前情況下只使用單元測試來記錄各種學習筆記。

            下面是我針對切片(Slice)的測試代碼,從中可以驗證文檔中說的一些重要信息,比如:可隨時動態增減元素,擴充時會重新分配并復制內存(類似于 std::vector) 等

          func TestSlice(t *testing.T) {
           //方法1:直接創建一個保存有10個整數的slice
           intSlice := make([]int, 10, 15) //{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
           for idx := 0; idx < len(intSlice); idx++ {
            intSlice[idx] = idx + 1
           }
           GOUNIT_ASSERT(t, len(intSlice) == 10, "make創建的slice長度")
           GOUNIT_ASSERT(t, cap(intSlice) == 15, "make創建的slice容量")

           //從尾端向數組切片中追加元素
           newIntSlice := append(intSlice, 11, 12, 13)
           GOUNIT_ASSERT(t, len(intSlice) == 10, "append后原來的Slice不變")
           GOUNIT_ASSERT(t, len(newIntSlice) == 13, "append后新的Slice")
           GOUNIT_ASSERT(t, cap(newIntSlice) == 15, "cap(newIntSlice) == 15")
           GOUNIT_ASSERT(t, &newIntSlice != &intSlice, "append返回新的切片")
           GOUNIT_ASSERT(t, &newIntSlice[0] == &intSlice[0], "底層的數組是同一個")

           newIntSlice[0] = 99
           GOUNIT_ASSERT(t, newIntSlice[0] == intSlice[0], "未進行內存擴充的情況下新舊Slice指向同一個底層數組")

           newAddressIntSlice := append(intSlice, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
           GOUNIT_ASSERT(t, cap(newAddressIntSlice) == 30, "擴充后的長度,目前實現采用容量翻倍的方式")
           newAddressIntSlice[0] = 199
           GOUNIT_ASSERT(t, &newAddressIntSlice[0] != &intSlice[0], "進行了內存擴充,底層數組不再一樣")
           GOUNIT_ASSERT(t, newAddressIntSlice[0] != intSlice[0], "進行了內存擴充,底層數組不再一樣")

           //方法2:先創建一個array,然后基于該array創建slice
           intArray := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
           intSliceFromArray := intArray[0:5] //[:]--基于全部元素, [5:]--從第5個元素開始的所有元素
           GOUNIT_ASSERT(t, len(intSliceFromArray) == 5, "array[n:m]創建的slice長度")
           GOUNIT_ASSERT(t, cap(intSliceFromArray) == 10, "array[n:m]創建的slice容量")
           GOUNIT_ASSERT(t, cap(intArray) == 10, "數組的容量")

           //下面代碼會在運行時拋出"index out of range"的異常(panic) -- 因為該slice長度是5(即0~4)
           //intSliceFromArray[5] = 10

           //在slice后追加slice,注意最后的三個點
           S3 := append(newIntSlice, intSliceFromArray...)
           GOUNIT_ASSERT(t, len(S3) == 18 && cap(S3) == 30, "在slice后追加slice")

           //copy函數,如兩個切片不一樣大,會按照較小的切片的元素個數進行復制
           var newS = make([]int, 3)
           nCopy := copy(newS, intSlice[0:5])
           GOUNIT_ASSERT(t, nCopy == 3, "只復制3個元素")
          }



          posted on 2013-07-11 11:19 順其自然EVO 閱讀(264) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年7月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 历史| 合阳县| 务川| 上虞市| 兴仁县| 沙洋县| 高平市| 罗定市| 基隆市| 清流县| 陇川县| 九龙县| 木里| 正阳县| 汶上县| 上虞市| 扎赉特旗| 溧阳市| 宣化县| 壶关县| 桑日县| 吉安市| 德兴市| 格尔木市| 西盟| 临夏市| 剑河县| 来安县| 巍山| 上高县| 靖远县| 东源县| 峨山| 定远县| 莱西市| 海丰县| 巴塘县| 黄龙县| 尼勒克县| 双城市| 屯留县|