成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【妙用協(xié)程】 - 單元測(cè)試的setUp和tearDown

MartinDai / 2745人閱讀

摘要:一般的做法是把這些動(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

相關(guān)文章

  • 談?wù)勴?xiàng)目重構(gòu)與測(cè)試

    這篇文章摘自我的博客, 歡迎大家沒(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的這種同步...

    Lavender 評(píng)論0 收藏0
  • 談?wù)勴?xiàng)目重構(gòu)與測(cè)試

    這篇文章摘自我的博客, 歡迎大家沒(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的這種同步...

    wuaiqiu 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記- 單元測(cè)試,UnitTest

    摘要:所謂的單元測(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)...

    k00baa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<