qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Go語言學(xué)習(xí)]之一:搭建單元測試環(huán)境

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

            這里簡單介紹Go中的測試環(huán)境搭建方法,大家可以參考著搭建并測試學(xué)習(xí)。

            Go中的測試方式

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

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

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

            針對本人的學(xué)習(xí)筆記需要,當(dāng)前情況下只使用單元測試來記錄各種學(xué)習(xí)筆記。

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

          func TestSlice(t *testing.T) {
           //方法1:直接創(chuàng)建一個保存有10個整數(shù)的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創(chuàng)建的slice長度")
           GOUNIT_ASSERT(t, cap(intSlice) == 15, "make創(chuàng)建的slice容量")

           //從尾端向數(shù)組切片中追加元素
           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], "底層的數(shù)組是同一個")

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

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

           //方法2:先創(chuàng)建一個array,然后基于該array創(chuàng)建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]創(chuàng)建的slice長度")
           GOUNIT_ASSERT(t, cap(intSliceFromArray) == 10, "array[n:m]創(chuàng)建的slice容量")
           GOUNIT_ASSERT(t, cap(intArray) == 10, "數(shù)組的容量")

           //下面代碼會在運(yùn)行時拋出"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函數(shù),如兩個切片不一樣大,會按照較小的切片的元素個數(shù)進(jìn)行復(fù)制
           var newS = make([]int, 3)
           nCopy := copy(newS, intSlice[0:5])
           GOUNIT_ASSERT(t, nCopy == 3, "只復(fù)制3個元素")
          }

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

            這里簡單介紹Go中的測試環(huán)境搭建方法,大家可以參考著搭建并測試學(xué)習(xí)。

            Go中的測試方式

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

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

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

            針對本人的學(xué)習(xí)筆記需要,當(dāng)前情況下只使用單元測試來記錄各種學(xué)習(xí)筆記。

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

          func TestSlice(t *testing.T) {
           //方法1:直接創(chuàng)建一個保存有10個整數(shù)的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創(chuàng)建的slice長度")
           GOUNIT_ASSERT(t, cap(intSlice) == 15, "make創(chuàng)建的slice容量")

           //從尾端向數(shù)組切片中追加元素
           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], "底層的數(shù)組是同一個")

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

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

           //方法2:先創(chuàng)建一個array,然后基于該array創(chuàng)建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]創(chuàng)建的slice長度")
           GOUNIT_ASSERT(t, cap(intSliceFromArray) == 10, "array[n:m]創(chuàng)建的slice容量")
           GOUNIT_ASSERT(t, cap(intArray) == 10, "數(shù)組的容量")

           //下面代碼會在運(yùn)行時拋出"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函數(shù),如兩個切片不一樣大,會按照較小的切片的元素個數(shù)進(jìn)行復(fù)制
           var newS = make([]int, 3)
           nCopy := copy(newS, intSlice[0:5])
           GOUNIT_ASSERT(t, nCopy == 3, "只復(fù)制3個元素")
          }



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


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


          網(wǎng)站導(dǎo)航:
           
          <2013年7月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 渭源县| 宜都市| 巴林左旗| 吐鲁番市| 渭源县| 青田县| 芦山县| 故城县| 株洲县| 个旧市| 张家口市| 新丰县| 天峻县| 高邑县| 浙江省| 舞钢市| 宁阳县| 水城县| 竹山县| 十堰市| 柘城县| 河曲县| 贡山| 曲麻莱县| 沾益县| 凤台县| 涿州市| 台江县| 广德县| 定西市| 嘉鱼县| 外汇| 安阳市| 贵定县| 盘锦市| 乐平市| 峨眉山市| 广平县| 阿拉善右旗| 南部县| 西安市|