Go語(yǔ)言單元測(cè)試和壓力測(cè)試初次實(shí)踐

1. 待測(cè)試源碼文件 gotest.go

package gotest

import "errors"

func Division(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("除數(shù)不能為0")
    }
    return a / b, nil
}

2. 單元測(cè)試代碼代碼部分

gotest_test.go:這是我們的單元測(cè)試文件,但是記住下面的這些原則:
  • 文件名必須是_test.go結(jié)尾的,這樣在執(zhí)行g(shù)o test的時(shí)候才會(huì)執(zhí)行到相應(yīng)的代碼
  • 你必須import testing這個(gè)包
  • 所有的測(cè)試用例函數(shù)必須是Test開頭
  • 測(cè)試用例會(huì)按照源代碼中寫的順序依次執(zhí)行
  • 測(cè)試函數(shù)TestXxx()的參數(shù)是testing.T,我們可以使用該類型來記錄錯(cuò)誤或者是測(cè)試狀態(tài)
  • 測(cè)試格式:func TestXxx (t *testing.T),Xxx部分可以為任意的字母數(shù)字的組合,但是首字母不能是小寫字母[a-z]元践,例如Testintdiv是錯(cuò)誤的函數(shù)名。
  • 函數(shù)中通過調(diào)用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,說明測(cè)試不通過佳窑,調(diào)用Log方法用來記錄測(cè)試的信息。
package gotest

import (
    "testing"
)

func Test_Division_1(t *testing.T) {
    if i, e := Division(6, 2); i != 3 || e != nil {
        t.Error("除法函數(shù)測(cè)試沒通過")
    } else {
        t.Log("第一個(gè)測(cè)試通過了")
    }
}

func Test_Division_2(t *testing.T) {
    t.Error("就是不通過")
}

然后在項(xiàng)目目錄下執(zhí)行g(shù)o test父能,便會(huì)顯示如下信息:

F:\GoPath\src\testsample\gotest>go test

FAIL
exit status 1
FAIL    testsample/gotest       0.491s

也可執(zhí)行g(shù)o test -v 顯示更詳細(xì)的信息

3. 性能測(cè)試

壓力測(cè)試用來檢測(cè)函數(shù)(方法)的性能神凑,和編寫單元功能測(cè)試的方法類似,此處不再贅述,但需要注意以下幾點(diǎn):
  • 壓力測(cè)試用例必須遵循如下格式,其中XXX可以是任意字母數(shù)字的組合溉委,但是首字母不能是小寫字母
    func BenchmarkXXX(b *testing.B) { ... }
  • go test不會(huì)默認(rèn)執(zhí)行壓力測(cè)試的函數(shù)鹃唯,如果要執(zhí)行壓力測(cè)試需要帶上參數(shù)-test.bench,語(yǔ)法:-test.bench="test_name_regex",例如go test -test.bench=".*"表示測(cè)試全部的壓力測(cè)試函數(shù)
  • 在壓力測(cè)試用例中,請(qǐng)記得在循環(huán)體內(nèi)使用testing.B.N,以使測(cè)試可以正常的運(yùn)行
    文件名也必須以_test.go結(jié)尾

下面我們新建一個(gè)壓力測(cè)試文件webbench_test.go瓣喊,代碼如下所示:

package gotest

import "testing"

func Benchmark_Division(b *testing.B) {
    //fmt.Printf("b.N ===========================%d\n", b.N)
    for i := 0; i < b.N; i++ { //use b.N for looping
        Division(46, 0)
    }
}

func Benchmark_TimeConsumingFunction(b *testing.B) {
    b.StopTimer() //調(diào)用該函數(shù)停止壓力測(cè)試的時(shí)間計(jì)數(shù)

    //做一些初始化的工作,例如讀取文件數(shù)據(jù),數(shù)據(jù)庫(kù)連接之類的,
    //這樣這些時(shí)間不影響我們測(cè)試函數(shù)本身的性能

    b.StartTimer() //重新開始時(shí)間
    for i := 0; i < b.N; i++ {
        Division(4, 5)
    }
}

我們執(zhí)行命令go test webbench_test.go gotest.go -test.bench=".*"坡慌,可以看到如下結(jié)果:

image.png

上面的結(jié)果顯示我們沒有執(zhí)行任何TestXXX的單元測(cè)試函數(shù),顯示的結(jié)果只執(zhí)行了壓力測(cè)試函數(shù)藻三,第一條顯示了Benchmark_Division執(zhí)行了2000000000次洪橘,每次的執(zhí)行平均時(shí)間是0.3納秒,第二條顯示了Benchmark_TimeConsumingFunction執(zhí)行了2000000000棵帽,每次的平均執(zhí)行時(shí)間是0.29納秒熄求。最后一條顯示總共的執(zhí)行時(shí)間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逗概,一起剝皮案震驚了整個(gè)濱河市弟晚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逾苫,老刑警劉巖卿城,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铅搓,居然都是意外死亡藻雪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門狸吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勉耀,“玉大人,你說我怎么就攤上這事蹋偏”愠猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵威始,是天一觀的道長(zhǎng)枢纠。 經(jīng)常有香客問我,道長(zhǎng)黎棠,這世上最難降的妖魔是什么晋渺? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脓斩,結(jié)果婚禮上木西,老公的妹妹穿的比我還像新娘。我一直安慰自己随静,他們只是感情好八千,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布吗讶。 她就那樣靜靜地躺著,像睡著了一般恋捆。 火紅的嫁衣襯著肌膚如雪照皆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天沸停,我揣著相機(jī)與錄音膜毁,去河邊找鬼。 笑死愤钾,一個(gè)胖子當(dāng)著我的面吹牛爽茴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绰垂,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼室奏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了劲装?” 一聲冷哼從身側(cè)響起胧沫,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎占业,沒想到半個(gè)月后绒怨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谦疾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年南蹂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片念恍。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡六剥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峰伙,到底是詐尸還是另有隱情疗疟,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布瞳氓,位于F島的核電站策彤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匣摘。R本人自食惡果不足惜店诗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望音榜。 院中可真熱鬧庞瘸,春花似錦、人聲如沸囊咏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梅割。三九已至霜第,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間户辞,已是汗流浹背泌类。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留底燎,地道東北人刃榨。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像双仍,于是被迫代替她去往敵國(guó)和親枢希。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Go怎么寫測(cè)試用例 開發(fā)程序其中很重要的一點(diǎn)就是測(cè)試朱沃,我們?nèi)绾伪WC代碼質(zhì)量苞轿,如何保證每個(gè)函數(shù)都是可運(yùn)行的,運(yùn)行結(jié)果...
    Carrism閱讀 6,397評(píng)論 0 3
  • 開發(fā)程序其中很重要的一點(diǎn)是測(cè)試逗物,我們?nèi)绾伪WC代碼的質(zhì)量搬卒,如何保證每個(gè)函數(shù)是可運(yùn)行,運(yùn)行結(jié)果是正確的翎卓,又如何保證寫出...
    Venture_Mark閱讀 1,687評(píng)論 0 1
  • 背景 隨著區(qū)塊鏈的這2年的快速發(fā)展契邀,Go語(yǔ)言和針對(duì)GO語(yǔ)言測(cè)試工具也越來越完善,特別是Go語(yǔ)言的靜態(tài)代碼掃描工具完...
    老余2017閱讀 11,321評(píng)論 1 17
  • 在*_test.go文件中失暴,有三種類型的函數(shù):測(cè)試函數(shù)坯门、基準(zhǔn)測(cè)試(benchmark)函數(shù)、示例函數(shù)逗扒。一個(gè)測(cè)試函數(shù)...
    一斗閱讀 1,674評(píng)論 0 0
  • 小楊同學(xué)三年的高中生活就這樣結(jié)束了田盈,他將迎來暫新的大學(xué)生活。高中三年缴阎,終生難忘允瞧。我們邁過坎兒,跨過河蛮拔,一路...
    幸運(yùn)潤(rùn)澤閱讀 686評(píng)論 0 14