最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GOLang單元測試用法詳解

 更新時間:2022年12月15日 11:21:28   作者:上后左愛  
Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實現(xiàn)單元測試和性能測試。本文將通過示例詳細(xì)聊聊Go語言單元測試的原理與使用,需要的可以參考一下

概念

單元測試 UT測試,針對程序來進行正確檢測測試工作,一個優(yōu)秀強壯代碼 需要有完美的 UT測試用例

go test基本用法

  • go test 測試用例放在 *_test.go 文件中,與被測函數(shù)放到同一個目錄下面go build 時候不會構(gòu)建成包一部分
  • 被測試用例函數(shù)命名 TestXXX. 第一個字母必須大寫
  • 測試函數(shù): 檢測邏輯是否正確
  • 基準(zhǔn)函數(shù)以BenChmark 為函數(shù)名稱前綴, 衡量函數(shù)性能
  • 示例函數(shù): 以Example 函數(shù)名稱為前綴函數(shù) 提供編譯器正確性的示例文檔

go test 基礎(chǔ)用例

首先 GoLand 中g(shù)o Test 不成熟,如果直接運行 會拋出 Undefined 的指令

借助GoLand 對于指定方式 使用Generate 對需要函數(shù)產(chǎn)生對應(yīng)的XX_test.go 文件

只能 Teiminal 下:

如果想 直接運行當(dāng)前目錄下所有測試用例: run go test,在當(dāng)前目錄下面右鍵即可
如果指向單純運行某個函數(shù) 需要 到該目錄下面:

go test -v -run TestXXX 即可

goLand 給我們產(chǎn)生的單元測試使用用例 值需要我們字節(jié)填寫對應(yīng) name(測試用例名稱),args(數(shù)組,輸入?yún)?shù)) want(返回參數(shù))

type args struct {
		s string
	}
	tests := []struct {
		name string
		args args
		want bool
	}{
		// TODO: Add test cases.
		{
			"test1",
			args{
				"kafka",
			},
			true,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := IsPalindrome(tt.args.s); got != tt.want {
				t.Errorf("IsPalindrome() = %v, want %v", got, tt.want)
			}
		})
	}

使用 Go mod 解決此問題

在 GoPATH目錄下 手動窗口 bin, pkg, src 三個目錄

配置 Go Moudle 路徑

直接運行GOLand 即可

go test -v : 測試函數(shù)名字和運行時間
go test -v -run 對應(yīng)正則表達式,測試函數(shù)與正確表達式匹配才會過濾 指定某個特定函數(shù)

測試可執(zhí)行程序

用來測試一個可執(zhí)行程序一個包的名字是main, 示例: 將程序拆分兩個函數(shù), echo 函數(shù)完成真正的工作 main 函數(shù)用于處理命令行參數(shù)和 echo可能返回錯誤

import (
    "flag"
    "fmt"
    "io"
    "os"
    "strings"
)
var (
    n = flag.Bool("n", false, "omit trailing newline")
    s = flag.String("s", " ", "separator")
)
var out io.Writer = os.Stdout // modified during testing
func main() {
    flag.Parse()
    if err := echo(!*n, *s, flag.Args()); err != nil {
        fmt.Fprintf(os.Stderr, "echo: %v\n", err)
        os.Exit(1)
    }
}
func echo(newline bool, sep string, args []string) error {
    fmt.Fprint(out, strings.Join(args, sep))
    if newline {
        fmt.Fprintln(out)
    }
    return nil
}
import (
    "bytes"
    "fmt"
    "testing"
)
func TestEcho(t *testing.T) {
    var tests = []struct {
        newline bool
        sep     string
        args    []string
        want    string
    }{
        {true, "", []string{}, "\n"},
        {false, "", []string{}, ""},
        {true, "\t", []string{"one", "two", "three"}, "one\ttwo\tthree\n"},
        {true, ",", []string{"a", "b", "c"}, "a,b,c\n"},
        {false, ":", []string{"1", "2", "3"}, "1:2:3"},
    }
    for _, test := range tests {
        descr := fmt.Sprintf("echo(%v, %q, %q)",
            test.newline, test.sep, test.args)
        out = new(bytes.Buffer) // captured output
        if err := echo(test.newline, test.sep, test.args); err != nil {
            t.Errorf("%s failed: %v", descr, err)
            continue
        }
        got := out.(*bytes.Buffer).String()
        if got != test.want {
            t.Errorf("%s = %q, want %q", descr, got, test.want)
        }
    }
}

外部測試包解決循環(huán)依賴

外部測試主要用來 解決 測試過程中循環(huán)依賴問題, GO語言中禁止包進行循環(huán)依賴,解決一個下層包的測試代碼導(dǎo)入上層包的這種行為解決方案:z在net.url 包所在目錄聲明一個獨立url_test 測試包,其中包名_test 后綴告訴go test 工具創(chuàng)建一個額外包進行允許測試

測試覆蓋比例

go test -run=Coverage -coverprofile=c.out gopl.io/ch7/eval

go tool cover -html=c.out

測試基準(zhǔn)函數(shù)

在固定的工作負(fù)載下的性能,一Benchmark 前綴

go test -bench=IsPalindrome , . 表示匹配所有基準(zhǔn)測試函數(shù)

func BenchmarkIsPalindrome(b *testing.B) {
	for i := 0; i < b.N; i++ {
		IsPalindrome("A man, a plan, a canal: Panama")
	}
}
goos: windows
goarch: amd64
pkg: goprograme/src
cpu: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
BenchmarkIsPalindrome
BenchmarkIsPalindrome-4          2308773               502.9 ns/op

1. 基準(zhǔn)函數(shù)數(shù)字后綴 -4 表示運行時候?qū)?yīng) GOMAXPROCS 值, 與并發(fā)相關(guān)的基準(zhǔn)測試重要信息
2. 每個調(diào)用函數(shù) 花費時間 502.9 微妙
3. 明顯 上面 函數(shù) 判斷是 第二個函數(shù) 使用 

1.n := len(letters) /2 z只比較一般方式優(yōu)化 測試后只是改進 提升 4%

2. 在每個字符預(yù)先分配一個足夠大的數(shù)組,這樣避免在append 函數(shù)時候可能導(dǎo)致內(nèi)存多次重新分配
-- 通過性能工具的測試 從而優(yōu)化我們的程序

func IsPalindrome(s string) bool {
    letters := make([]rune, 0, len(s))
    for _, r := range s {
        if unicode.IsLetter(r) {
            letters = append(letters, unicode.ToLower(r))
        }
    }
    n := len(letters) / 2
    for i := 0; i < n; i++ {
        if letters[i] != letters[len(letters)-1-i] {
            return false
        }
    }
    return true
}

到此這篇關(guān)于GOLang單元測試用法詳解的文章就介紹到這了,更多相關(guān)GO單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang內(nèi)存對齊詳解

    golang內(nèi)存對齊詳解

    在golang中,每一種數(shù)據(jù)類型都有其對應(yīng)的數(shù)據(jù)類型大小,也就是占用了多少內(nèi)存空間,我們可以通過unsafe.Sizeof函數(shù),來確定一個變量占用的內(nèi)存字節(jié)數(shù),本文將詳細(xì)給大家介紹golang內(nèi)存對齊,需要的朋友可以參考下
    2023-10-10
  • go語言定時器Timer及Ticker的功能使用示例詳解

    go語言定時器Timer及Ticker的功能使用示例詳解

    這篇文章主要為大家介紹了go語言定時器的功能使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • GO語言打包成.exe程序的方法

    GO語言打包成.exe程序的方法

    Go語言以其高效的編譯能力和簡潔的語法,能夠輕松打包生成Windows系統(tǒng)下的.exe可執(zhí)行文件,用戶只需安裝Go編譯器、編寫Go源代碼并使用gobuild命令指定輸出文件名即可完成編譯,感興趣的可以了解一下
    2024-10-10
  • golang如何解決go get命令無響應(yīng)問題

    golang如何解決go get命令無響應(yīng)問題

    文章介紹了在Go語言中處理由于官方庫被封禁導(dǎo)致依賴下載失敗的方法,包括設(shè)置代理和直接克隆依賴包到GOPATH/src下
    2024-12-12
  • Golang中堆排序的實現(xiàn)

    Golang中堆排序的實現(xiàn)

    堆是一棵基于數(shù)組實現(xiàn)的特殊的完全二叉樹,本文主要介紹了Golang中堆排序的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Golang實現(xiàn)自己的Redis(TCP篇)實例探究

    Golang實現(xiàn)自己的Redis(TCP篇)實例探究

    這篇文章主要介紹了Golang實現(xiàn)自己的Redis(TCP篇)實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Go語言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說明

    Go語言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說明

    這篇文章主要為大家介紹了Go語言metrics應(yīng)用監(jiān)控指標(biāo)的基本使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • Go語言定時器Timer和Ticker的使用與區(qū)別

    Go語言定時器Timer和Ticker的使用與區(qū)別

    在Go語言中內(nèi)置的有兩個定時器,Timer和Ticker,本文主要介紹了Go語言定時器Timer和Ticker的使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 淺析Go語言中的map數(shù)據(jù)結(jié)構(gòu)是如何實現(xiàn)的

    淺析Go語言中的map數(shù)據(jù)結(jié)構(gòu)是如何實現(xiàn)的

    在?Go?中,map?是一種用于存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),它提供了一種快速查找和訪問數(shù)據(jù)的方式,下面我們就來看看Go語言中是如何實現(xiàn)map數(shù)據(jù)結(jié)構(gòu)的吧
    2024-03-03
  • Go單例模式與Once源碼實現(xiàn)

    Go單例模式與Once源碼實現(xiàn)

    這篇文章主要介紹了Go單例模式與Once源碼實現(xiàn),本文結(jié)合示例代碼給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12

最新評論

盐津县| 鄂州市| 祁连县| 本溪| 壶关县| 沐川县| 商南县| 平利县| 玉溪市| 临沧市| 清徐县| 波密县| 麦盖提县| 革吉县| 潢川县| 商水县| 贵阳市| 泸定县| 高陵县| 常德市| 六安市| 巢湖市| 文成县| 龙口市| 南城县| 宝丰县| 历史| 双峰县| 平泉县| 镇江市| 布拖县| 二手房| 卢湾区| 穆棱市| 孟连| 和龙市| 聂拉木县| 长白| 车险| 德州市| 仙桃市|