需求:

  • 判断一个结构体序列化和反序列化的结果,将结果输出到文本中;
  • 再用testing框架做测试。

思路:

  • 序列化和反序列化的结果以bool变量的形式输出,这样我们就不需要判断具体的结果是啥;

vim hero.go // 定义结构体和函数

package main
import (
	"fmt"
	"encoding/json"
	"io/ioutil"
)

type Hero struct {
	Name   string
	Gender string
	Class  string
	Skill  string
}
// 序列化过程
func (h *Hero) Serialize() bool {
	filePath := "/Users/junming.li/Desktop/hero.txt"
	data,err := json.Marshal(h)
	if err != nil {
		fmt.Println("序列化失败,报错:", err)
		return false
	}

	// 将序列化之后的值写入到filePath下
	// 这里也是直接判断bool量是真还是假
	err = ioutil.WriteFile(filePath, data, 0666)
	if err != nil {
		fmt.Println("写入文件失败,报错:", err)
		return false
	} 
	return true
}

// 反序列化
func (h *Hero) UnSerialize() bool {
	filePath := "/Users/junming.li/Desktop/hero.txt"
	// 先获取序列化之后的字符串
	data,err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Println("获取文件失败,报错:", err)
		return false
	}

	// 反序列化
	err = json.Unmarshal(data, &h)
	if err != nil {
		fmt.Println("反序列化失败,报错:", err)
		return false
	}
	return true
}

vim hero_test.go // 做测试,注意文件名有固定的格式:待测文件名_test.go

package main
import (
	"testing"
)

func TestSerialize(t *testing.T) {    // 固定格式:TestXxx(t *testing.T),注意待测函数名首字母大写
	var h = Hero {
		Name : "张无忌",
		Gender : "男",
		Class  : "明教",
		Skill  : "乾坤大挪移",
	}

	res := h.Serialize()          // 获取该函数的结果,如果成功怎么true,失败则为false
	if res == false {
		t.Fatalf("测试未通过,预期结果=%v, 测试结果=%v", true,res)
	}
	t.Logf("测试通过")
}

func TestUnSerialize(t *testing.T) {
	var h Hero
	res := h.UnSerialize()
	if res == false {
		t.Fatalf("测试未通过,预期结果=%v, 测试结果=%v", true,res)
	}
	t.Logf("测试通过")
}

执行测试:

go test -v

测试结果: