日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

一文詳解Go語言單元測試的原理與使用_Golang

作者:山與路 ? 更新時間: 2022-11-13 編程語言

前言

為什么要引用單元測試類

傳統方法的缺點分析

不方便,我們需要在main函數中去調用,這樣就需要去修改main函數,如果現在項目正在運行,就可能去停止項目

不利于管理,因為當我們測試多個函數或者多個模塊時,都需要寫在main函數,不利于我們管理和清晰我們的思路

單元測試基本介紹

Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實現單元測試和性能測試,testing框架和其他語言中的測試框架類似,可以基于這個框架寫針對相應函數的測試用例,也可以基于該框架寫相應的壓力測試用例

優點

  • 確保每個函數是可運行,并且運行結果是正確的
  • 確保寫出來的代碼性能是好的
  • 單元測試能及時的發現程序設計或實現的邏輯錯誤,使問題及早暴露,便于問題的定位解決,而性能測試的重點在于發現程序設計的一些問題,讓程序能夠在高并發的情況下還能保持穩定

Testing規范

1.測試用例文件名必須以 _test.go結尾

2.測試用例函數必須以Test開頭,一般來說就是Test+被測試的函數名

3.測試用例函數的形參類型必須是*testing.T

4.一個測試用例文件中,可以由多個測試用例函數

5.當出現錯誤使,可以使用t.Fatalf來格式化輸出錯誤信息,并退出程序

6.t.Logf方法可以輸出相應的日志

7.測試用例函數,并沒有放在main函數中,但是卻執行了main函數

8.pass表示測試用例運行成功,Fail表示測試用例運行失敗

9.測試單個文件,一個要帶上被測試的源文件

go test -v cal_test.go cal.go

10.測試單個方法

go test -v -test.run 函數名

基本使用

cal.go

package main

func add(n int)(int){
	var sum int
	for i:=1;i<=n ;i++  {
		sum+=i
	}
	return sum
}

cal_test.go

package main

import "testing"

//函數名規范 Test+要測試的函數名(t *testing)
func TestAdd(t *testing.T){
	res:=add(9)
	if(res!=55){
		t.Fatalf("add(10)執行錯誤,期望值=%v 實際值=%v\n",55,res)
	}
	t.Logf("執行正確!!")
}

Golang運行

命令行

案例

monster.go

package monster

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=",err)
		return false
	}
	filename:="f:/test.ser"
	err2:=ioutil.WriteFile(filename,data,0666)
	if err2 !=nil{
		fmt.Println("err=",err2)
		return false
	}
	return true
}
func (this *Monster) ReStore() bool {
	filename:="f:/test.ser"
	reader,err2:=ioutil.ReadFile(filename)
	if err2 !=nil{
		fmt.Println("err=",err2)
		return false
	}
	err:=json.Unmarshal(reader,this)
	if err!=nil{
		fmt.Println("err=",err)
		return false
	}
	return true
}

monster_test.go

package monster

import (
	"fmt"
	"testing"
)

func TestStore(t *testing.T)  {
	monster:=&Monster{
		Name:  "張三",
		Age:   18,
		Skill: "打游戲",
	}
	flag:=monster.Store()
	if !flag{
		t.Fatalf("monster.Store() 錯誤,期望為%v,實際為%v",true,flag)
	}
	t.Logf("monster.Store()測試成功")
}
func TestRestore(t *testing.T)  {
	var monster=&Monster{}
	flag:=monster.ReStore()
	if !flag{
		t.Fatalf("monster.ReStore() 錯誤,期望為%v,實際為%v",true,flag)
	}
	t.Logf("monster.Store()測試成功")
	fmt.Println(monster) //&{張三 18 打游戲}
}

原文鏈接:https://juejin.cn/post/7146112523429740575

欄目分類
最近更新