2015-03-19 61 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