需求:
- 判断一个结构体序列化和反序列化的结果,将结果输出到文本中;
- 再用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
测试结果: