2015-03-19 33 views
1

我想找到一種方法來使用鼻子在類中運行多個測試用例,但我需要這樣做,鼻子只創建一個實例類。這個類將測試一個網絡,網絡的設置需要幾分鐘的時間,因此需要通過類的一個實例運行所有的測試。這裏是什麼,我試圖做一個簡單的例子:鼻子測試類與發電機的多個測試,但只有一個類的實例

class TestUmbrella(object): 

    def __init__(self): 
     log.info('__init__ called') 

    def run_A(self): 
     log.info('Test A is running') 

    def run_B(self): 
     log.info('Test B is running') 

    def run_C(self): 
     log.info('Test C is running') 

    def run_test(self): 
     for x in (self.run_A, self.run_B, self.run_C): 
      yield x 

這將產生:

2015-03-19 12:22:31,330: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: Test A is running 
.2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test B is running 
.2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test C is running 
. 
---------------------------------------------------------------------- 
Ran 3 tests in 0.002s 

OK 

我想看到的是:

2015-03-19 12:22:31,330: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: Test A is running 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test B is running 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test C is running 

任何想法如何讓鼻子做這個?

回答

2

兩種方式來獲得你想要的東西: 使用unittest.TestCase類setUpClass您TestUmbrella:

from unittest import TestCase 
import logging as log 

class TestUmbrella(TestCase): 
    @classmethod 
    def setUpClass(cls): 
     log.info('__init__ called') 

    def run_A_test(self): 
     log.info('Test A is running') 

    def run_B_test(self): 
     log.info('Test B is running') 

    def run_C_test(self): 
     log.info('Test C is running') 

注意,你將不再是在飛行中能產量的東西,就必須重命名方法符合鼻子測試模式。這會給你:

$ nosetests cls_test.py -v 
INFO:root:__init__ called 
run_A_test (cls_test.TestUmbrella) ... INFO:root:Test A is running 
ok 
run_B_test (cls_test.TestUmbrella) ... INFO:root:Test B is running 
ok 
run_C_test (cls_test.TestUmbrella) ... INFO:root:Test C is running 
ok 

---------------------------------------------------------------------- 
Ran 3 tests in 0.007s 

OK 

或者,你可以注入你的設置方法到類,而不是作爲類初始化的一部分:

import logging as log 

class TestUmbrella(object): 
    def my_setup(self): 
     log.info('__init__ called') 

    def run_A(self): 
     log.info('Test A is running') 

    def run_B(self): 
     log.info('Test B is running') 

    def run_C(self): 
     log.info('Test C is running') 

    def run_test(self): 
     self.my_setup() 
     for x in (self.run_A, self.run_B, self.run_C): 
      yield x 

最後,如果你實在無法卸載從繁重的邏輯構造函數,可以從這樣一個獨立的功能運行測試:

def run_test(): 
    tu = TestUmbrella() 
    for x in (tu.run_A, tu.run_B, tu.run_C): 
     yield x 
+0

有了這兩種方法的鼻子仍然創造TestUmbrella的三個實例。我試圖找到一種方法來讓鼻子運行三個測試用例,但是從TestUmbrella的單個實例運行。 – user1106281 2015-03-23 03:17:47

+0

已更新,以顯示如何獲取TestUmbrella類的單個實例。 – Oleksiy 2015-03-24 00:41:17

+0

爲什麼我沒有想到這一點? :)謝謝,這正是我正在尋找的東西。 – user1106281 2015-03-25 13:39:40

相關問題