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)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜