摘要:一般的做法是把這些動(dòng)作寫在和的兩個(gè)方法里,單元測試框架會(huì)負(fù)責(zé)在開始和結(jié)束的時(shí)候調(diào)用這兩個(gè)方法。從視覺上無法直觀的指導(dǎo)原來和是一對(duì)的。然后再把這個(gè)小的上下文附著到主測試邏輯上這里利用了單元測試的的特性,把轉(zhuǎn)化為回調(diào)在的時(shí)候就設(shè)置好。
很多測試都需要在啟動(dòng)的時(shí)候做一些事情,然后在結(jié)束的時(shí)候再把做的事情給清理了。一般的做法是把這些動(dòng)作寫在setUp和tearDown的兩個(gè)方法里,單元測試框架會(huì)負(fù)責(zé)在開始和結(jié)束的時(shí)候調(diào)用這兩個(gè)方法。
class SomeTest(unittest.case.TestCase): def setUp(self): super(SomeTest, self).setUp() setup_db() def tearDown(self): clean_db() super(SomeTest, self).tearDown()
這種寫法有好幾個(gè)煩人的地方。首先是Logic Locality不好的問題:setup_db()和clean_db()是分在兩處的,中間可能隔著很長一段代碼。從視覺上無法直觀的指導(dǎo)setup_db()原來和clean_db()是一對(duì)的。
其次是很難重用的問題(上綱上線的話就是復(fù)雜度不好管理的問題),為了避免重復(fù)寫公共的setUp和tearDown一般會(huì)抽取出一個(gè)UsingDbTest這樣的基類。這樣所有的子類必須記得super(xxx, self).setUp(),否則就會(huì)覆蓋掉基類的setUp。其次在需要有多個(gè)維度的東西需要復(fù)用的時(shí)候,比如有一個(gè)UsingDbTest的基類,有一個(gè)UsingNetworkTest的基類,難道讓子類繼承兩個(gè)基類么(mixin是不是有點(diǎn)過于復(fù)雜了?)。
使用generator可以很好的解決這個(gè)問題。首先我們寫一個(gè)方法來做setUp和tearDown:
@contextlib.contextmanager def using_db(): setup_db() yield clean_db()
這樣可以非常清晰地知道setup_db和clean_db是一對(duì)的。然后再把這個(gè)小的上下文附著到主測試邏輯上:
def apply_context(test, contextmanager): contextmanager.__enter__() test.addCleanup(lambda: contextmanager.__exit__(None, None, None)) class SomeTest(unittest.case.TestCase): def setUp(self): apply_context(self, using_db())
這里利用了單元測試的addCleanup的特性,把tearDown轉(zhuǎn)化為回調(diào)在setUpd的時(shí)候就設(shè)置好。利用這種方式,我們可以用組合的方式而不是繼承的方式來復(fù)用公共的setUp和tearDown的邏輯了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/37401.html
這篇文章摘自我的博客, 歡迎大家沒事去逛逛~ 背景 這幾個(gè)月我開發(fā)了公司里的一個(gè)restful webservice,起初技術(shù)選型的時(shí)候是采用了flask框架。雖然flask是一個(gè)同步的框架,但是可以配合gevent或者其它方式運(yùn)行在異步的容器中(測試鏈接),效果看上去也還可以,因此就采用了這種方式。 后面閱讀了tornado的源碼,也去了解了各種協(xié)程框架以及運(yùn)行的原理??偢杏Xflask的這種同步...
這篇文章摘自我的博客, 歡迎大家沒事去逛逛~ 背景 這幾個(gè)月我開發(fā)了公司里的一個(gè)restful webservice,起初技術(shù)選型的時(shí)候是采用了flask框架。雖然flask是一個(gè)同步的框架,但是可以配合gevent或者其它方式運(yùn)行在異步的容器中(測試鏈接),效果看上去也還可以,因此就采用了這種方式。 后面閱讀了tornado的源碼,也去了解了各種協(xié)程框架以及運(yùn)行的原理??偢杏Xflask的這種同步...
摘要:所謂的單元測試,就是對(duì)一個(gè)模塊,一個(gè)函數(shù),或則是一個(gè)類進(jìn)行正確性檢測的一類測試工作。當(dāng)然,單元測試也會(huì)讓代碼量大大增加。編寫單元測試代碼需要引入的包。再所有單元測試開始前運(yùn)行函數(shù)在所有單元測試運(yùn)行后運(yùn)行。 所謂的單元測試,就是對(duì)一個(gè)模塊,一個(gè)函數(shù),或則是一個(gè)類進(jìn)行正確性檢測的一類測試工作。 以測試驅(qū)動(dòng)的開發(fā)方式叫做測試驅(qū)動(dòng)開發(fā)(Test Drived Development). 這種開...
閱讀 2628·2021-09-06 15:02
閱讀 3305·2021-09-02 10:18
閱讀 2903·2019-08-30 15:44
閱讀 758·2019-08-30 15:43
閱讀 2019·2019-08-30 14:08
閱讀 2818·2019-08-30 13:16
閱讀 1481·2019-08-26 13:52
閱讀 984·2019-08-26 12:21