Golang单元测试举例

1.第一个例子

cal.go

Go 复制代码
package main

func addUpper(n int) int {
	res := 0
	for i := 1; i <= n; i++ {
		res += i
	}
	return res
}

func getSub(n1 int, n2 int) int {
	return n1 - n2
}

cal_test.go

Go 复制代码
package main

//测试文件名必须是_test.go结尾
//测试函数必须Test开头
import (
	"fmt"
	"testing"
)

// 编写要给测试用例,去测试addUpper是否正确
func TestAddUpper(t *testing.T) {
	//调用
	res := addUpper(10)
	if res != 55 {
		//输出错误信息,退出程序
		t.Fatalf("AddUpper(10)执行错误,期望值=%v,实际值=%v\n", 55, res)
	}
	//如果正确,输出日志
	t.Logf("AddUpper(10) 执行正确...")
}

func TestHello(t *testing.T) {
	fmt.Println("TestHello被调用了")
}

// 编写要给测试用例,去测试addUpper是否正确
func TestGetSub2(t *testing.T) {
	//调用
	res := getSub(10, 3)
	if res != 7 {
		t.Fatalf("getSub(10,3)执行错误,期望值=%v,实际值=%v\n", 7, res)
	}
	//如果正确,输出日志
	t.Logf("getSub(10,3) 执行正确...")
}

说明:再GoLand中,要运行测试哪个函数可以自行选择

测试文件名必须以_test.go结尾;

测试方法的开头必须是Testxxx()

2.第二个例子,测试对象的序列化和反序列化

monster.go

Go 复制代码
package test2

import (
	"encoding/json"
	"fmt"
	"os"
)

type Monster struct {
	Name  string
	Age   int
	Skill string
}

// 序列化对象
func (this *Monster) Store() bool {
	//先序列化
	data, err := json.Marshal(this)
	if err != nil {
		fmt.Println("marshal err=", err)
		return false
	}
	//保存到文件
	filePath := "e:/monster.ser"
	err = os.WriteFile(filePath, data, 0666)
	if err != nil {
		fmt.Println("write file err=", err)
		return false
	}
	return true
}

// 反序列化对象
func (this *Monster) ReStore() bool {
	//1.从文件中读取序列化字符串
	filePath := "e:/monster.ser"
	data, err := os.ReadFile(filePath)
	if err != nil {
		fmt.Println("ReadFile err=", err)
		return false
	}

	//2.使用data []byte 反序列化
	err = json.Unmarshal(data, this)
	if err != nil {
		fmt.Println("Unmarshal err=", err)
		return false
	}
	return true
}

monster_test.go

Go 复制代码
package test2

import (
	"fmt"
	"testing"
)

func TestStrore(t *testing.T) {
	//先创建一个Monster
	monster := &Monster{
		Name:  "林动",
		Age:   20,
		Skill: "大荒芜经",
	}
	res := monster.Store()
	if !res {
		t.Fatalf("monster.Store()错误,希望为=%v 实际为=%v\n", true, res)
	}
	t.Logf("monster.Store() 测试成功")
}

func TestReStore(t *testing.T) {
	//先创建一个Monster实例,不需要指定字段的值
	var monster = &Monster{}
	res := monster.ReStore()
	if !res {
		t.Fatalf("monster.ReStore() 错误,希望=%v 实际为=%v\n", true, res)
	}
	//进一步判断
	fmt.Printf("%v %v %v\n", monster.Name, monster.Age, monster.Skill)
}
Go 复制代码
=== RUN   TestReStore
林动 20 大荒芜经
--- PASS: TestReStore (0.00s)
PASS
相关推荐
努力的lpp1 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
菜鸟~noob2331 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
泡海椒2 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb2 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
Keven_113 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
脉动数据行情14 小时前
C# 实现德指 DAX 期货 WebSocket 实时行情监听
开发语言·websocket·c#
大圣编蚕4 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
菜鸟~noob2334 小时前
【电子战】第02篇:能量检测器 vs. 相关检测器【含matlab代码】
开发语言·matlab
OpenAnolis小助手5 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界5 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法