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