2014-10-28 53 views
2

我可能在這裏有一個XY problem,所以對於我的實際問題提供更好的解決方案的答案與提示如何做愚蠢的答案一樣受歡迎我想要做的事情。Monkey-patch一個由TON文件導入的模塊(單元測試)

X的問題是,我有一個非常大的測試套件,使用Python's unittest module。讓我們說數百個個人test_<foo>.py文件。我知道如何使用unittest.discover()來發現它們。但是,這將它們全部放在一個大的測試套件中。我需要三個(或四個或五個)子集:例如,frontend測試套件和backend測試套件。爲了簡單起見,你可以假設子集是互斥的。

我不想在一個大的「目錄」中手動列出所有的frontend測試;我想繼續使用discover()(這樣新添加的前端測試會自動獲取,而「目錄」永遠不會過時)。

所以我的想法是用某種方式使用裝飾器。例如,我現有的測試用例模塊

import unittest 

class TestButtons(unittest.TestCase): 

    def test_simple(self): 
     self.assertTrue(True) 

將成爲

import unittest 
import MySuites 

@MySuites.FrontEndTest 
class TestButtons(unittest.TestCase): 

    def test_simple(self): 
     self.assertTrue(True) 

,然後,有discover() ED所有測試用例,我可以通過檢查類屬性那麼大的套房滲入到我的小套房一些適當的方式。

Y問題是,這個解決方案要求我將import MySuites分成我的數百個測試文件中的每一個。如果可能的話,我想避免這種差異。事實上,理想情況下,我可以寫

import unittest 

@unittest.FrontEndTest 
class TestButtons(unittest.TestCase): 

    def test_simple(self): 
     self.assertTrue(True) 

使用某種猴子補丁。不過,我再也不希望import一些其他模塊在數百個文件中;我只想讓unittest「做我想做的事」,而不必告訴它數百次。

這可能嗎?本地Python說話者如何解決我的問題?

回答

1

我想子類unittest.TestCase,然後讓我的測試代碼導入模塊與子類。

# module: quuxunittest.py 
import unittest 

class FrontEndCase(unittest.TestCase): 
    pass 

class BackEndCase(unittest.TestCase): 
    pass 

然後,您可以像平常一樣編寫測試,並依賴測試發現來忽略不應該運行的測試。

import quuxunittest 

class TestButtons(quuxunittest.FrontEndCase): 
    def test_simple(self): 
     self.assertTrue(True) 

然後,你會想要subclass unittest發現代碼來利用這一點。

相關問題