亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

MartinDai / 2772人閱讀

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

相關(guān)文章

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

    這篇文章摘自我的博客, 歡迎大家沒事去逛逛~ 背景 這幾個(gè)月我開發(fā)了公司里的一個(gè)restful webservice,起初技術(shù)選型的時(shí)候是采用了flask框架。雖然flask是一個(gè)同步的框架,但是可以配合gevent或者其它方式運(yùn)行在異步的容器中(測試鏈接),效果看上去也還可以,因此就采用了這種方式。 后面閱讀了tornado的源碼,也去了解了各種協(xié)程框架以及運(yùn)行的原理??偢杏Xflask的這種同步...

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

    這篇文章摘自我的博客, 歡迎大家沒事去逛逛~ 背景 這幾個(gè)月我開發(fā)了公司里的一個(gè)restful webservice,起初技術(shù)選型的時(shí)候是采用了flask框架。雖然flask是一個(gè)同步的框架,但是可以配合gevent或者其它方式運(yùn)行在異步的容器中(測試鏈接),效果看上去也還可以,因此就采用了這種方式。 后面閱讀了tornado的源碼,也去了解了各種協(xié)程框架以及運(yùn)行的原理??偢杏Xflask的這種同步...

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

    摘要:所謂的單元測試,就是對(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). 這種開...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<