go 用testify搭建完整易用的測試環(huán)境

單元測試

單元測試在大型應(yīng)用開發(fā)中是非常重要的一環(huán)胰舆。go 自身提供了單元測試框架晶衷,但是原生單元測試框架提供的功能太弱了你虹,所以這里分享下最近研究搭建的單元測試環(huán)境

目標

  1. 支持測試與數(shù)據(jù)庫交互抛杨,每個單元測試用例的數(shù)據(jù)庫環(huán)境必須都是要干凈的

  2. 支持斷言

  3. 簡單的在測試中生成數(shù)據(jù)

為了達成這些目標暗赶,我們可以使用一些現(xiàn)成的go第三方包來幫我們

testify

https://github.com/stretchr/testify
testify用go實現(xiàn)的一個assert風(fēng)格的測試框架鄙币,這個包提供了我們需要的斷言的功能,提供了非常豐富的斷言方法。

assert.Equal(t, 123, 123, "they should be equal")
assert.NotNil(ret, "")

同時testify也提供了如mock這種的功能蹂随,如果有童鞋需要十嘿,可以自己去翻閱文檔https://godoc.org/github.com/stretchr/testify/mock

重點來了

testify提供了suite包提供了類似rails minitest中可以給每個測試用例進行前置操作和后置操作的功能,這個方便的功能岳锁,在前置操作和后置操作中去初始化和清空數(shù)據(jù)庫绩衷,就可以幫助我們實現(xiàn)第一個目標。
同時,還可以聲明在這個測試用例周期內(nèi)都有效的全局變量

type ExampleTestSuite struct {
    suite.Suite
    VariableThatShouldStartAtFive int
}

// 每個測試用例執(zhí)行前都會調(diào)用
func (suite *ExampleTestSuite) SetupTest() {
    test_helpers.Init(config.Cfg)
}

//其中一個測試用例
func (suite *ExampleTestSuite) TestExample() {
    assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive)
}

// In order for 'go test' to run this suite, we need to create
// a normal test function and pass our suite to suite.Run
func TestExampleTestSuite(t *testing.T) {
    suite.Run(t, new(ExampleTestSuite))
}

// 每個測試用例執(zhí)行后都會調(diào)用
func (suite *ExecutorTestSuite) TearDownTest() {
    test_helpers.CleanTables()
}

dbcleaner

https://github.com/khaiql/dbcleaner
有了前置操作和后置操作咳燕,我們就可以想辦法來保證每個用例的數(shù)據(jù)庫狀態(tài)都是干凈的勿决。最簡單的辦法,就是在SetupTest方法中聲明數(shù)據(jù)庫招盲,然后用例操作完數(shù)據(jù)庫玩后低缩,在TearDownTest()方法中truncate數(shù)據(jù)庫。

但是曹货,go test的時候咆繁,是多個協(xié)程一起跑的,如果簡單這樣做,有可能導(dǎo)致測試時數(shù)據(jù)庫出錯控乾, dbcleaner可以幫助我們避免這個問題么介,這個包是模仿ruby中的database_cleaner的功能。使用方法如下
在測試中有可能用到的表蜕衡,先聲明加鎖

Cleaner.Acquire("users")

然后在用例結(jié)束后

Cleaner.Clean("users")

配合suite壤短,就可以保證數(shù)據(jù)狀態(tài)的干凈。
同時建議慨仿,為了減輕些測試的心智久脯,最好全局定義有可能用到的所有的表,然后在每個測試用例镰吆,同意調(diào)用一個封裝好的函數(shù)

factory

https://github.com/nauyey/factory
有了上面兩個庫帘撰,已經(jīng)完成我們第一和第二個目標了,第三個目標同樣非常重要万皿,測試用例中摧找,生成數(shù)據(jù)是非常重要的,如果牢硅,每次都調(diào)用model層的方法來生成數(shù)據(jù)蹬耘,非常繁瑣,因為生成的測試數(shù)據(jù)减余,有很多字段综苔,并不是我們關(guān)注的,但是用model去生成位岔,有很多時候如筛,必須遵循驗證規(guī)則,不得不去聲明一些字段抒抬,所以factory就非常重要了杨刨,同時factory也是各種測試體系中不可或缺的一部分.
factory這個庫,參考的是ruby中factory_bot這個庫擦剑,使用ruby寫測試過的同學(xué)妖胀,絕對都使用過這個庫可免,go中的factory庫,實現(xiàn)了大部分功能

userFactory := def.NewFactory(User{}, "db_table_users",
    def.SequenceField("ID", 1, func(n int64) interface{} {
        return n
    }),
    def.DynamicField("Name", func(user interface{}) (interface{}, error) {
        return fmt.Sprintf("User Name %d", user.(*User).ID), nil
    }),
    def.Trait("boy",
        def.Field("Gender", "male"),
    ),
)

定義好了factory后做粤,使用就非常簡單了

user := &User{}
Create(userFactory, WithTraits("boy")).To(user2) // saved to database

這樣,在測試用例中捉撮,非常的方便怕品,能減輕很多工作量。
把factory定義在全局的某個地方巾遭,就可以配置一次肉康,然后在多個測試用例中使用

go-randomdata

https://github.com/Pallinder/go-randomdata
這個庫可以生成一些隨機的假數(shù)據(jù),就是測試里常說faker

總結(jié)

有了這些庫灼舍,在加上適當?shù)姆庋b吼和,就趕快開始愉快的寫測試吧!??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骑素,一起剝皮案震驚了整個濱河市炫乓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌献丑,老刑警劉巖末捣,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異创橄,居然都是意外死亡箩做,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門妥畏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邦邦,“玉大人,你說我怎么就攤上這事醉蚁∪枷剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵馍管,是天一觀的道長郭赐。 經(jīng)常有香客問我,道長确沸,這世上最難降的妖魔是什么捌锭? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮罗捎,結(jié)果婚禮上观谦,老公的妹妹穿的比我還像新娘。我一直安慰自己桨菜,他們只是感情好豁状,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布捉偏。 她就那樣靜靜地躺著,像睡著了一般泻红。 火紅的嫁衣襯著肌膚如雪夭禽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天谊路,我揣著相機與錄音讹躯,去河邊找鬼。 笑死缠劝,一個胖子當著我的面吹牛潮梯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惨恭,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼秉馏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脱羡?” 一聲冷哼從身側(cè)響起萝究,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锉罐,沒想到半個月后糊肤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡氓鄙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年馆揉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抖拦。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡升酣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出态罪,到底是詐尸還是另有隱情噩茄,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布复颈,位于F島的核電站绩聘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耗啦。R本人自食惡果不足惜凿菩,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帜讲。 院中可真熱鬧衅谷,春花似錦、人聲如沸似将。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玷氏,卻和暖如春堵未,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盏触。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工兴溜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耻陕。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像刨沦,于是被迫代替她去往敵國和親诗宣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 歡迎轉(zhuǎn)載想诅,轉(zhuǎn)載請注明來源:github地址 謝謝點贊 相關(guān)書籍下載 Python測試開發(fā)庫 參考資料 https:...
    python測試開發(fā)閱讀 4,609評論 1 67
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理召庞,服務(wù)發(fā)現(xiàn),斷路器来破,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 用到的組件 1篮灼、通過CocoaPods安裝 2、第三方類庫安裝 3徘禁、第三方服務(wù) 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,601評論 1 180
  • 見字如面诅诱,老朋友。 一些情緒沒有出口送朱。 人生如果只剩下清醒娘荡。 該多蒼白。 將人間風(fēng)月都說了驶沼,不過大夢一場炮沐。 不訴離...
    張迦男閱讀 333評論 0 0