内容简介:最后输出的结果为
前言
- 话说上回讲到用testing package来进行golang的单元测试,但testing也是有其限制性,靠使用者不断地写if else来判断显然麻烦,那么今天就讲一下gocheck这个单元测试框架的使用
gocheck框架使用
- gocheck作为golang的一种测试框架,可以直接继承go test使用,他允许之前基于testing框架的测试平滑迁移到gocheck框架而不会发生冲突,gocheck API与testing也有很多相似的地方
安装运行
- 第一步当然还是安装啦,执行命令
go get -u gopkg.in/check.v1
- 这样能够获取到最新版本的gocheck框架,然后我们参考实例 gocheck_test.go
package hello_test import ( "testing" "io" . "gopkg.in/check.v1" ) func Test(t *testing.T) { TestingT(t) } //继承testing的方法,可以直接使用go test命令运行 type MySuite struct{} //创建测试套件结构体 var _ = Suite(&MySuite{}) func (s *MySuite) TestHelloWorld(c *C) { //声明TestHelloWorld方法为MySuite套件的测试用例 c.Assert(42, Equals, "42") c.Assert(io.ErrClosedPipe, ErrorMatches, "io: .*on closed pipe") c.Check(42, Equals, 42) }
- gocheck拥有丰富的断言api,比如例子中的 Assert 和 Check
- gocheck单元测试代码最基本的结构如例子所示,声明一个测试套件,在测试套件下写测试方法,即测试用例
- 直接使用go test在测试文件当前路径下运行,运行结果
E:\go_project>go test ---------------------------------------------------------------------- FAIL: gocheck_test.go:17: MySuite.TestHelloWorld gocheck_test.go:18: c.Assert(42, Equals, "42") ... obtained int = 42 ... expected string = "42" OOPS: 0 passed, 1 FAILED --- FAIL: Test (0.00s) FAIL exit status 1 FAIL _/E_/go_project 0.441s
- Assert判断出42整型和“42”字符串不是相同,所以运行FAIL,将其中一个改过了,如
c.Assert(42, Equals, 42)
- 运行测试则通过
E:\go_project>go test OK: 1 passed PASS ok _/E_/go_project 0.290s
前置后置操作
- 除了最基本的结构,当然少不得我们熟悉的测试用例前置后置操作,用于满足用例执行前的准备,以及执行完成后清理环境等方法
func (s *SuiteType) SetUpSuite(c *C) - 在测试套件启动前执行一次 func (s *SuiteType) SetUpTest(c *C) - 在每个用例执行前执行一次 func (s *SuiteType) TearDownTest(c *C) - 在每个用例执行后执行一次 func (s *SuiteType) TearDownSuite(c *C) - - 在测试套件用例都执行完成后执行一次
- 我们尝试用以下代码来执行
package hello_test import ( "testing" "io" "fmt" "strconv" . "gopkg.in/check.v1" ) var a int =1 // Hook up gocheck into the "go test" runner. func Test(t *testing.T) { TestingT(t) } type MySuite struct{} var _ = Suite(&MySuite{}) func (s *MySuite) SetUpSuite(c *C) { str3:="第1次套件开始执行" fmt.Println(str3) } func (s *MySuite) TearDownSuite(c *C) { str4:="第1次套件执行完成" fmt.Println(str4) } func (s *MySuite) SetUpTest(c *C) { str1:="第"+strconv.Itoa(a)+"条用例开始执行" fmt.Println(str1) } func (s *MySuite) TearDownTest(c *C) { str2:="第"+strconv.Itoa(a)+"条用例执行完成" fmt.Println(str2) a=a+1 } func (s *MySuite) TestHelloWorld(c *C) { c.Assert(42, Equals, 42) c.Assert(io.ErrClosedPipe, ErrorMatches, "io: .*on closed pipe") c.Check(42, Equals, 42) } func (s *MySuite) TestHelloTerry(c *C) { c.Assert("terry", Equals, "terry") c.Assert(io.ErrClosedPipe, ErrorMatches, "io: .*on closed pipe") c.Check(42, Equals, 42) }
最后输出的结果为
E:\go_project>go test 第1次套件开始执行 第1条用例开始执行 第1条用例执行完成 第2条用例开始执行 第2条用例执行完成 第1次套件执行完成 OK: 2 passed PASS ok _/E_/go_project 0.502s
- 通过执行输出证明,上面方法可满足用例在执行时的前置后置操作
选择执行指定用例
- 当然我们在执行用例的时候未必需要全部执行,那就需要通过一些选择性的API来选择部分用例执行,如跳过用例或用例套件使用skip
func (s *MySuite) SetUpSuite(c *C) { str3:="第1次套件开始执行" fmt.Println(str3) c.Skip("Skip TestSutie") //在测试套件启动前跳过整个测试套件的用例 } //其余代码参考上文
- 其运行结果为
E:\go_project>go test 第1次套件开始执行 第1次套件执行完成 OK: 0 passed, 2 skipped PASS ok _/E_/go_project 0.272s
- 如果在跳过套件中的测试用例
func (s *MySuite) TestHelloWorld(c *C) { c.Skip("Skip TestCase") //跳过当前测试用例 c.Assert(42, Equals, 42) c.Assert(io.ErrClosedPipe, ErrorMatches, "io: .*on closed pipe") c.Check(42, Equals, 42) }
- 其运行结果
E:\go_project>go test 第1次套件开始执行 第1条用例开始执行 第1条用例执行完成 第2条用例开始执行 第2条用例执行完成 第1次套件执行完成 OK: 1 passed, 1 skipped PASS ok _/E_/go_project 0.304s
- 除了跳过还有选择测试用例执行
$ go test -check.f MyTestSuite //选择测试套件 $ go test -check.f "Test.*Works" //选择测试方法 $ go test -check.f "MyTestSuite.Test.*Works" //选择套件中的方法
- 执行如下
E:\go_project>go test -check.f TestHelloTerry 第1次套件开始执行 第1条用例开始执行 第1条用例执行完成 第1次套件执行完成 OK: 1 passed PASS ok _/E_/go_project 0.293s
E:\go_project>go test -check.f MySuite.TestHelloTerry 第1次套件开始执行 第1条用例开始执行 第1条用例执行完成 第1次套件执行完成 OK: 1 passed PASS ok _/E_/go_project 0.319s
小结
- 综合比对使用,gocheck比testing满足更多的测试场景,也提供更多的API,让测试人员更方便的使用golang进行单元测试,单元测试环节基本讲到这里,下一节开始讲API测试啦,谢谢大家继续关注
参考
- gocheck官方文档: http://labix.org/gocheck
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- golang分层测试之单元测试-testing使用
- golang分层测试之http接口测试入门
- golang分层测试之httpexpect+httptest测试应用
- golang分层测试之语言入门
- 说说分层测试中HTTP的API测试工具
- DDD 分层
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。