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