在Gogland里对GO程序进行单元测试!

时间:2022-04-29 16:24:56

单元测试在程序开发中具有很重要的作用!

1,可以保证程序代码的健壮,能够最小范围测试程序代码,从而保证程序的正确性!

2,可以通过单元测试代码快速了解当前的程序。

我在先前的几个软件公司工作时候,都对程序代码进行单元测试,一般来说经过单元测试的程序质量都很好!!现在我使用Gogland来学习GO语言,同时也想用它来开发GO语言程序,那么如何在在Gogland里编写GO程序的单元测试呢?

一,GO语言为我们准备好了测试框架!

单元测试文件的执行需要单元测试框架,GO语言已经为我们准备好了,Go语言中自带有一个轻量级的测试框架testing,可以使用"go test"命令来实现单元测试和性能测试!无须进行任何其它安装或配置,我们就可以编写GO程序的单元测试程序了!!

二,GO语言的单元测试程序应该放到哪里?

我看到很多文章说GO语言的测试程序应该放到一个统一的目录中,但是实际上并不需要那样做。你可以把GO语言的单元测试文件放到任意你想放的地方!!!

一般单元测试文件程序都是随着程序的开发同步编写,一个功能结束后,就应该编写单元测试文件了,而且还有一点,一个单元测试文件中可能会包含多个单元测试方法,我们通常不会全部执行这个单元测试文件中的所有单元测试方法。以我以往的编写单元测试程序的经验来说,通常都是单独执行一个单元测试文件的某个单元测试方法!!在这样的情况下,单元测试文件存放到什么地方都无所谓,只要能够正常执行需要测试的单元测试文件和单元测试方法就可以了!!!

三,在Gogland中编写单元测试程序。

在正式编写单元测试文件之前,我们应该记住这些GO语言单元测试文件的编写规则!!

  • 文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码
  • 你必须import testing这个包
  • 所有的测试用例函数必须是Test开头
  • 测试用例会按照源代码中写的顺序依次执行
  • 测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态
  • 测试格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z],例如Testintdiv是错误的函数名。
  • 函数中通过调用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,说明测试不通过,调用Log方法用来记录测试的信息。

下面是被测试文件和单元测试文件代码:

structFunc.go : 这是要被测试的程序文件,我想对"StructFunc"函数进行单元测试,这个函数是这个程序文件中的一个!

package mydata

//自定义的结构,首字母大写可以被导出,包括里面的字段首字母大写才被输出
type TestStruct struct {
Id string
Name string
} //这是一个结构函数,返回两个值,输入为方法接收者
func (ts *TestStruct) StructFunc (idIn,nameIn string) (idOut,nameOut string){ ts.Id=idIn;
ts.Name=nameIn; return ts.Id,ts.Name
} //这是另外一个结构函数,返回结构,输入为方法接收者
func (ts *TestStruct) StructFunc2 (idIn,nameIn string) TestStruct{ ts.Id=idIn;
ts.Name=nameIn; return *ts
} //这是普通函数,函数名前面没有方法接收者
func OrdinaryFunc (input1,input2 string) (outPut string){ temp:=input1+input2 return temp
}

structFunc_test.go : 这是上面的单元测试程序,仅仅测试"StructFunc"函数。

package mydata

import (
"testing"
) //StructFunc的测试方法
func TestStructFunc(t *testing.T) { //声明结构函数输入的变量
var (
idIn string
nameIn string
) //给结构函数输入的变量赋值
idIn = "inputId"
nameIn = "inputName" //得到结构
ts := &TestStruct{} //调用结构函数1
idOut, nameOut := ts.StructFunc(idIn, nameIn) if idOut==idIn&&nameOut==nameIn{
t.Log("测试通过!")
}else{
t.Error("函数执行错误")
} }

四,在Gogland中随意执行任意单元测试方法。

在任意一个单元测试文件中的任意一个单元测试方法,都应该可以被单独执行,在Gogland确实可以这样做!!!

1,打开要执行测试的单元测试程序,随后有鼠标左键选中要执行测试的测试方法。

在Gogland里对GO程序进行单元测试!

2,在选中的单元测试方法上面鼠标右键,随后在弹出菜单中执行对应命令。

在Gogland里对GO程序进行单元测试!

3,这是执行单元测试方法后的截图,表明当前被测试方法完全正确,通过对它的单元测试了!在Gogland里对GO程序进行单元测试!

4,对其它单元测试方法,同样用鼠标右键,在弹出菜单中执行对应命令就可以了。下面是我对新增的一个单元测试方法进行的单元测试截图。

在Gogland里对GO程序进行单元测试!

5,我们可以把单元文件存放到任意位置执行,我把上面的单元测试文件拷贝到"mydata"包中进行单元测试,一样顺利进行了单元测试,下面是截图:

在Gogland里对GO程序进行单元测试!

一点建议:虽然我们可以把单元测试程序放到任意地方,不过为了维护方便,我还是建议存放到一个固定位置,我把我所有的单元测试程序都存放到”test“包中了!

参考:

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/11.3.md

http://blog.csdn.net/samxx8/article/details/46894587