Go项目的测试代码1(基础)

最近写了测试代码,整理了一下。

先看看简单的测试代码

// add_test.go  ==> 文件名 _test.go 结尾的默认为测试代码文件
package models

import (
 "testing"
)

//Test开头的默认为测试方法
func TestAdd(t *testing.T) {
 //arrange
 var x, y, res int
 x = 2
 y = 3

 //act
 result = Add(x, y)

 //assert
 if result != 5 {
  t.Fatal("Add的结果不正确")
 }
}
// add.go
package models

func Add(x, y int) int {
 return x + y
}

查看测试结构。

$ go test -v    ==> 依次运行当前package的 _test.go文件的测试方法。
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
PASS
ok      gotest/test5    0.006s

目前编写测试代码普遍公认的模板结构。

1)arrange: 测试之前需要准备的代码。
2)act: 实际要测试的方法。
3)assert: 结果确认。


如果测试不通过呢?

//assert
if result != 6 { //==>结果改成 6
 t.Fatal("Add的结果不正确")
}
$ go test
--- FAIL: TestAdd (0.00s)
        add_test.go:36: Add的结果不正确
FAIL
exit status 1
FAIL    gotest/test5/models     0.006s

import ( “reflect” “testing” )

func Equal(t *testing.T, exp, got interface{}) { if !reflect.DeepEqual(exp, got) { t.Errorf("\033[31m\n exp: %v \n got: %v \033[39m\n", exp, got) t.FailNow() } }

//assert if result != 6 { //==>结果改成 6 t.Fatal(“Add的结果不正确”) }

//=====» 比较的方法改用自己写的test包的Equal方法。

//assert test.Equal(t, result, 6)


输出测试未通过的代码位置,以及比较结果。

$ go test — FAIL: TestAdd (0.00s) test.go:10: exp: 5 got: 6 FAIL exit status 1 FAIL gotest/test5/models 0.007s


这样可以按照自己的喜好来自定义提示了。

-----
覆盖率  
**go test -cover**  

go test -cover

go test -cover -coverprofile=coverage.out go tool cover -html=./coverage.out


可以查看测试代码的覆盖率,这只是一个补助的功能。  
不需要过分的要求高覆盖率,因为维护测试代码也是耗精力的。

-----

下篇文章介绍项目中我是怎么写测试代码的...^^  
[Go项目的测试代码(项目运用)](https://limingxie.github.io/go/my_go_test1/)

### 未完继续


-------------------------------------

<!-- ## 한국어버전


요즘 테스트코드에 관심을 갖게 되여서 지금 개발하고 있는 Go프로젝트에 적용하여 보았습니다.  
보편화되고 있는 테스트코드는 아래와 같은 내역을 포함하고 있습니다.

------

> 1)arrange: 테스트하기전에 준비해야할 내역.  
> 2)act: 실제 테스트하려고 하는 함수.  
> 3)assert: 결과확인.  

------

간단한 쌤플을 볼까요?

// add_test.go ==> 파일명이 _test.go 로 끄나면 Go에서는 테스트코드 파일이라고 판단합니다. package models

import ( “testing” )

//Test로 시작되는 함수는 테스트함수라고 판단합니다. func TestAdd(t *testing.T) { //arrange var x, y, res int x = 2 y = 3

//act
result = Add(x, y)

//assert
if result != 5 {
	t.Fatal("결과값이 정확하지 않습니다.")
}

}

// add.go package models

func Add(x, y int) int { return x + y }


위내용을 실행시키면 아래와 같은 결과를 얻을수 있습니다.

$ go test -v ==> 순서대로 해당 package의 _test.go파일에 테스트함수를 실행합니다. === RUN TestAdd — PASS: TestAdd (0.00s) PASS ok gotest/test 0.006s


-----

**테스트에 실패하면 어떻게 될까요?**

//assert if result != 6 { //==>결과가 6 라고 판단하시면 t.Fatal(“결과값이 정확하지 않습니다.”) }

$ go test — FAIL: TestAdd (0.00s) add_test.go:36: 결과값이 정확하지 않습니다. FAIL exit status 1 FAIL gotest/test/models 0.006s

<br />

**아래 test라는 패키지를 작성하고 그걸 응용하여 보겠습니다.**

package test

import ( “reflect” “testing” )

func Equal(t *testing.T, exp, got interface{}) { if !reflect.DeepEqual(exp, got) { t.Errorf("\033[31m\n exp: %v \n got: %v \033[39m\n", exp, got) t.FailNow() } }

//assert if result != 6 { //==>결과가 6 라고 판단하시면 t.Fatal(“결과값이 정확하지 않습니다.”) }

//=====» 확인시 새로 작성한test패키지의Equal함수를 사용하면

//assert test.Equal(t, result, 6)

테스트 정화히 어디에서 실해하였는지가 나와서 훨씬 편할겁니다.

$ go test — FAIL: TestAdd (0.00s) test.go:10: exp: 5 got: 6 FAIL exit status 1 FAIL gotest/test5/models 0.007s


위의 내용은 자신이 편하신대로 수정하여서 사용하면 됩니다...^^

-----
Coverage  
**go test -cover**  

go test -cover

go test -cover -coverprofile=coverage.out go tool cover -html=./coverage.out


이렇게 보면 테스트코드의 Coverage를 알수 있습니다.  
이건 보조기능일뿐 너무 여기 수치에 집착하시면 프로젝트초기엔 힘들어질겁니다.  
먼저 핵심기능에 테스트코드 적용하시고 안정단계에 들어서면 다시 Coverage를 높이게하여도 늦을거 같지 않습니다.


-----

### 미완결(계속)

----------------------------------------------
소중한 의견부탁드립니다. -->

`email: li_mingxie@163.com`