Go (一) 基础部分5 -- 单元测试,协程(goroutine),管道(channel)

本文围绕Go语言展开,介绍了单元测试,利用Go自带的“testing”框架和“go test”命令,可判断函数执行结果、检测代码性能。还讲解了goroutine(协程),它是轻量级线程,有独立栈空间、共享堆空间。此外,对channel(管道)进行了阐述,包括其定义、使用、遍历、关闭等操作及相关注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、单元测试

Go自带一个轻量级的"测试框架testing"和自带的"go test"命令来实现单元测试和性能测试。

1.确保每个函数时可运行,并且运行结果是正确的。
2.确保写出来的代码性能是好的。
3.单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决。而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定。

运用测试用例的指令:

go test:运行正确时,无日志,运行错误时,会输出日志

go test -v:运行正确或者错误都会输出日志

1.1、单元测试的快速入门(判断一个函数的执行结果是否符合预期)

1.测试用例文件必须以"_test.go"结尾,文件不能命名为:_test.go,test.go,test_xxx.go;

2.测试用例文件内任何 "Test开头且首字母大写"的函数(例:TestXxx)都会被执行,文件内不需要写main函数;

3.TestXxx(t *testing.T)的形参类型必须是*testing.T;

4.出现错误时,可以使用"t.Fatalf"来格式化错误信息,并退出程序;

5."t.Logf"方法可以输出相应的日志;

6.测试用例函数,没有main函数,也正常执行了,这也是测试用例的方便之处;

7.PASS表示测试用例运行成功,FAIL表示测试用例运行失败;

8.测试单个文件"cal_test.go",一定要带上被测试的原文件:go test -v cal_test.go main.go

9.测试单个方法:go test -v -test.run(固定参数) TestAddUpper(函数名)

package main

import (
	"fmt"
	"testing"
)

// 使用go test命令,能够自动执行如下形式的任何函数
// func TestXxx(*testing.T),其中Xxx可以是任何字母或字符串(第一个字母不能是[a-z])
func TestAddUpper(t *testing.T)  {
	res := AddUpper(10)
	if res != 55 {
		t.Fatalf("AddUpper函数执行错误,期望值:%v 返回值:%v",55,res)
	}
	t.Logf("AddUpper函数执行成功")
}

func TestSudada(t *testing.T)  {
	fmt.Println("函数TestSudada被执行")
}

测试函数:xxx.go,文件内包含要测试的"函数",文件内不需要写main函数。

package main

// xxx_test.go 内调用的函数
func AddUpper(n int) int  {
	res:=0
	for i:=0;i<=10;i++{
		res+=i
	}
	return res
}

"go test"命令执行错误时的返回结果

"go test"命令执行正确时的返回

1.2、单元测试-综合案例

测试用例文件:store_test.go(测试结构体的序列化和反序列化)

package main

import (
	"fmt"
	"testing"
)

// 测试用例TestStore
func TestStore(t *testing.T)  {
	// 先创建结构体变量
	var monster = Monster{
		Name: "牛魔王",
		Age: 18,
		Skill: "蛮牛冲撞",
	}
	StoreRes:=monster.Store()
	if !StoreRes {
		fmt.Println("Store函数测试错误,返回值不为ture")
	}
	// 返回值:
	// === RUN   TestStore
	// Store方法执行成功,test.txt文件保存成功
	// --- PASS: TestStore (0.00s)
}

// 测试用例TestReStore
func TestReStore(t *testing.T)  {
	// 先创建结构体变量
	var monster = Monster{}
	ReStoreRes:=monster.ReStore()
	if !ReStoreRes {
		fmt.Println("ReStore函数测试错误,返回值不为ture")
	}
	// 返回值:
	// === RUN   TestReStore
	// ReStore方法执行成功,反序列化的值为 &{牛魔王 18 蛮牛冲撞}
	// --- PASS: TestReStore (0.00s)
}

被测试对象:main.go(结构体和方法)

package main

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

type Monster struct {
	Name string
	Age int
	Skill string
}


func (this *Monster)Store() bool {
	// 序列化结构体变量
	data, err := json.Marshal(this)
	if err != nil {
		fmt.Println("序列化失败",err)
		return false
	}
	// 把序列化后的数据,写入到test.txt文件内
	WriteFileErr :=ioutil.WriteFile("test.txt",data,0666)
	if WriteFileErr != nil{
		fmt.Println("文件保存失败",WriteFileErr)
		return false
	}
	fmt.Println("Store方法执行成功,test.txt文件保存成功")
	return true
}


func (this *Monster)ReStore() bool {
	// 从文件中,读取序列化的数据
	data, ReadFileErr := ioutil.ReadFile("test.txt")
	if ReadFileErr != nil{
		fmt.Println("文件读取失败",R
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值