Golang 单元测试

Golang语言自带单元测试,使用时只需要按照提供的命名规则以及导入testing 包就能开始允许需要测试的方法。如下:

创建构造体

// 编写一个Monster结构体
package model

import (
	"encoding/json"
	"os"
	"fmt"
	"errors"
	"bufio"
	"io"
)

type Monster struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Skill string `json:"skill"`
}
// 提供一个工厂方法,创建Monster指针对象
func NewMonster(name string, age int, skill string) *Monster {
	return &Monster {
		Name : name,
		Age: age,
		Skill : skill,
	}
}

// 通过序列化monster
func (monster *Monster) Store() error {
	// 拿到序列化结果
  data, err := json.Marshal(monster)

	if err != nil {
		fmt.Println("Json serialized error, err=", err)
		return errors.New("Json serialized error")
	}
  // 创建一个文件
	filePath := "E:/serialized.txt"
	file, err2 := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0744)

	if err2 != nil {
		fmt.Println("File create error, ", err)
		return errors.New("File create error")
	}
  // 使用defer关闭资源
	defer file.Close()
	// 使用bufio来写入文件,也可以使用io/ioutil 包中的
  // ioutil.WriteFile(file2Path, content, 0744) 来写入文件内容。
	writer := bufio.NewWriter(file)
	str  := string(data) + "\r
"
	writer.WriteString(str)
	writer.Flush()

	fmt.Println("File content writer file success.")
	return nil
}
// 通过读取文件并反序列化为 monster结构体
func (monster *Monster) Restore(filePath string) error {
	// 打开指定的文件
	file, err := os.Open(filePath)

	if err != nil {
		fmt.Println("File open error=", err)
		return errors.New("File open error")
	}
	defer file.Close()
	// 通过缓冲区来读取文件。
  // 同时也可以通过io/ioutil.ReadFile() 来读取文件,如果大文件不建议使用该函数
	reader := bufio.NewReader(file)
	temp := ""
	for {
		str, err := reader.ReadString('
')
		if err == io.EOF {
			break
		}
		temp += str
	}
	fmt.Println("Read file result : ", temp)
  // 反序列化为monster实力
	err2 := json.Unmarshal([]byte(temp), &monster)

	if err2 != nil {
		fmt.Println("Unserialized error=", err2)
		return errors.New("Unserialized error")
	}
	
	fmt.Println("Unserialized result=", monster)
	return nil
}

上面构造体中,提供了Store()和Restore()两个方法,一个是将monster对象序列化之后保存到文件中,后者则是读取该文件,然后反序列化为monster结构体。

单元测试

命名规则 xxx_test.go ,xxx表示需要测试的文件名。 单元测试中的函数命名规则: func TestXxx(t *testing.T) , Test为函数名固定写法,Xxx首字符必须大写,一般是需要测试的方法名称。

package model

import (
	"testing"
)
// 测试Monster中的Store方法
func TestStore(t *testing.T) {
	// 通过工厂方法创建Monster实例
	monster := NewMonster("Mic", 300, "Just cry...")
	t.Logf("Create monster= %v 
", monster)
 	// 调用Store方法
	err := monster.Store()

	if err != nil {
		t.Fatalf("Monster.Store() testing failed.")
	}
	t.Logf("Monster.Store() testing success.")
}
//  测试Monster中的Restore方法
func TestRestore(t *testing.T) {
	monster := Monster{}
	filePath := "E:/serialized.txt"
	// 传入需要读取文件路径
	err := monster.Restore(filePath)

	if err != nil {
		t.Fatalf("Monster.Restore() testing failed.")
	}
	t.Logf("Monster.Restore() testing success.")
}

单元测试方法

  • 测试整个文件夹下的单元测试
go test : 只打印不成功的日志
go test -v  : 打印所有日志,包括方法中成功的日志或者不成功的日志
  • 测试指定的单元测试文件
go test -v  xxx_test.go xxx.go
  • 测试指定函数
go test -v -test.run TestRestore
表示只测试叫TestRestore的单元测试方法
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章