go test 基本規(guī)則

先使用最少的代碼來(lái)讓失敗的測(cè)試先跑起來(lái)

編寫測(cè)試

編寫測(cè)試和寫函數(shù)很類似,其中有一些規(guī)則

  • 它需要在一個(gè)名為 xxx_test.go 的文件中編寫

  • 測(cè)試函數(shù)的命名必須從單詞 Test 開(kāi)始

  • 測(cè)試函數(shù)只接受一個(gè)參數(shù) t *testing.T

現(xiàn)在這些信息足以讓我們明白,類型為 *testing.T 的變量 t 是你在測(cè)試框架中的 "hook"(鉤子),所以你可以在想要失敗時(shí)執(zhí)行 t.Fail() 之類的操作。

Go 文檔

Go 的另一個(gè)高質(zhì)量特征是文檔化。通過(guò)運(yùn)行 godoc -http:8000,可以在本地啟動(dòng)文檔。如果你訪問(wèn) localhost:8000/pkg,你將看到系統(tǒng)上安裝的所有包。

大多數(shù)標(biāo)準(zhǔn)庫(kù)都有優(yōu)秀的文檔和示例。瀏覽 http://localhost:8000/pkg/testing/ 是非常值得的,去看一下你有什么可以用的。

Go 的一些語(yǔ)法

  • 編寫測(cè)試

  • 用參數(shù)和返回類型聲明函數(shù)

  • ifelse,switch

  • 聲明變量和常量

TDD 過(guò)程以及步驟的重要性

  • 編寫一個(gè)失敗的測(cè)試,并查看失敗信息,可以看到我們已經(jīng)為需求寫了一個(gè) 相關(guān) 的測(cè)試,并且看到它產(chǎn)生了一個(gè) 易于理解的失敗描述

  • 編寫最少量的代碼以使其通過(guò),因此我們知道我們有可工作軟件

  • 然后 重構(gòu),支持我們測(cè)試的安全性,以確保我們擁有易于使用的精心制作的代碼

在我們的例子中,我們通過(guò)小巧易懂的步驟從 Hello()Hello("name"),到 Hello("name", "french")。

與"現(xiàn)實(shí)世界"軟件相比,這當(dāng)然是微不足道的,但原則依然成立。TDD 是一門需要通過(guò)開(kāi)發(fā)去實(shí)踐的技能,但通過(guò)將問(wèn)題分解成更小的可測(cè)試的組件,編寫軟件的時(shí)間將更加輕松。

package main

import "fmt"

const spanish = "Spanish"
const french = "French"
const englishPrefix = "Hello, "
const spanishHelloPrefix = "Hola, "
const frenchHelloPrefix = "Bonjour, "

func Hello(name string, language string) string {
    if name == "" {
        name = "World"
    }
    return greetingPrefix(language) + name
}

func greetingPrefix(language string) (prefix string) {
    switch language {
    case french:
        prefix = frenchHelloPrefix
    case spanish:
        prefix = spanishHelloPrefix
    default:
        prefix = englishPrefix
    }
    return
}
func main() {
    fmt.Println(Hello("world", ""))
}


package main

import "testing"

func TestHello(t *testing.T) {
    assertCorrectMessage := func(t *testing.T, got, want string) {
        t.Helper()//t.Helper() 需要告訴測(cè)試套件這個(gè)方法是輔助函數(shù)(helper)。通過(guò)這樣做,當(dāng)測(cè)試失敗時(shí)所報(bào)告的行號(hào)將在函數(shù)調(diào)用中而不是在輔助函數(shù)內(nèi)部
        if got != want {
            t.Errorf("got '%s' want '%s'", got, want)
        }
    }

    /*
    在這里,我們將在我們的測(cè)試庫(kù)中引入另一個(gè)工具 —— 子測(cè)試。有時(shí),對(duì)一個(gè) "事情" 進(jìn)行分組測(cè)試是很有用的,然后進(jìn)行描述不同場(chǎng)景的子測(cè)試。
    這種方法的好處是,你可以設(shè)置在其他測(cè)試中也能夠使用的共享代碼。
    當(dāng)我們檢查信息是否符合預(yù)期時(shí),會(huì)有重復(fù)的代碼。
     */

    t.Run("to a person", func(t *testing.T) {
        got := Hello("Chris", "")
        want := "Hello, Chris"
        assertCorrectMessage(t, got, want)
    })

    t.Run("empty string", func(t *testing.T) {
        got := Hello("", "")
        want := "Hello, World"
        assertCorrectMessage(t, got, want)
    })

    t.Run("in Spanish", func(t *testing.T) {
        got := Hello("Elodie", spanish)
        want := "Hola, Elodie"
        assertCorrectMessage(t, got, want)
    })

    t.Run("in French", func(t *testing.T) {
        got := Hello("Lauren", french)
        want := "Bonjour, Lauren"
        assertCorrectMessage(t, got, want)
    })
}



作者:Chris James 譯者:Donng 校對(duì):polaris1119,pityonline?

最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,562評(píng)論 19 139
  • How to Write GO Code 中文版 說(shuō)明官方原文本文按個(gè)人理解進(jìn)行意譯,水平有限,難免有錯(cuò)或偏差,歡...
    楠小忎閱讀 1,699評(píng)論 1 4
  • 喜歡薄荷,清新的味道,嗅一下,那個(gè)涼爽的氣味通過(guò)鼻子竄進(jìn)頭頂和心里。在夏天,最愛(ài)這樣涼爽的感覺(jué),好像一下子觸摸到冬...
    陳白胖閱讀 287評(píng)論 1 0
  • 廣東的孩子,這幾天天氣轉(zhuǎn)冷,還下雨。 還是“滾”回被窩吧。我們是南方人……
    小伍菇?jīng)?/span>閱讀 144評(píng)論 0 0

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