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開(kāi)頭
  • 測(cè)試用例會(huì)按照源代碼中寫(xiě)的順序依次執(zhí)行
  • 測(cè)試函數(shù)TestXxx()的參數(shù)是testing.T,我們可以使用該類(lèi)型來(lái)記錄錯(cuò)誤或者是測(cè)試狀態(tài)
  • 測(cè)試格式:func TestXxx (t *testing.T),Xxx部分可以為任意的字母數(shù)字的組合,但是首字母不能是小寫(xiě)字母[a-z],例如Testintdiv是錯(cuò)誤的函數(shù)名。
  • 函數(shù)中通過(guò)調(diào)用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,說(shuō)明測(cè)試不通過(guò),調(diào)用Log方法用來(lái)記錄測(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è)試沒(méi)通過(guò)")
    } else {
        t.Log("第一個(gè)測(cè)試通過(guò)了")
    }
}

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

然后在項(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è)試用來(lái)檢測(cè)函數(shù)(方法)的性能,和編寫(xiě)單元功能測(cè)試的方法類(lèi)似,此處不再贅述,但需要注意以下幾點(diǎn):
  • 壓力測(cè)試用例必須遵循如下格式,其中XXX可以是任意字母數(shù)字的組合,但是首字母不能是小寫(xiě)字母
    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ù)連接之類(lèi)的,
    //這樣這些時(shí)間不影響我們測(cè)試函數(shù)本身的性能

    b.StartTimer() //重新開(kāi)始時(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é)果顯示我們沒(méi)有執(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容