2015-04-17 20 views
0

我正在用鼻子进行测试,并想在另一个测试项目中使用一个变量。为此,我在设置类时创建变量。在我看来,变量是为每个项目复制的,所以类中的变量保持不变。如果不是一个简单的变量,我使用一个列表,我看到了我期待的行为。Python与鼻子:“测试课程”中的变量范围是什么?

我写了一个小为例,我们可以观察到var1varg进入测试时总是显示相同的值:

import time 
import sys 
import logging 

logger = logging.getLogger('008') 


class Test008: 
    varg = None 

    @classmethod 
    def setup_class(cls): 
     logger.info('* setup class') 
     cls.var1 = None 
     cls.list1 = [] 

    def setup(self): 
     logger.info('\r\n* setup') 
     logger.info('\t var1: {}, varg: {}, list: {}'.format(
      self.var1, self.varg, self.list1)) 

    def teardown(self): 
     logger.info('* teardown') 
     logger.info('\t var1: {}, varg: {}, list: {}'.format(
      self.var1, self.varg, self.list1)) 

    def test_000(self): 
     self.var1 = 0 
     self.varg = 0 
     self.list1.append(0) 
     pass 

    def test_001(self): 
     # Here I would like to access the variables but they still show 'None' 
     self.var1 = 1 
     self.varg = 1 
     self.list1.append(1) 
     pass 

    @classmethod 
    def teardown_class(self): 
     logger.info('* teardown class') 

结果:

nose.config: INFO: Ignoring files matching ['^\\.', '^_', '^setup\\.py$'] 
* setup class 
008_TestVars.Test008.test_000 ... 
* setup 
    var1: None, varg: None, list: [] 
* teardown 
    var1: 0, varg: 0, list: [0] 
ok 

008_TestVars.Test008.test_001 ... 
* setup 
    var1: None, varg: None, list: [0] 
* teardown 
    var1: 1, varg: 1, list: [0, 1] 
ok 
* teardown class 

---------------------------------------------------------------------- 

有没有办法有var1varg的值是否从一个测试继续进行到另一个测试?

+0

在我回答这个问题,告诉我你为什么要做到这一点 - 如果你让测试依赖于以前的测试,他们都没有单元测试数据(这可能是好的),你可能必须按照已知的顺序运行它们(这会遗漏一些反馈测试可能会给你的东西。为什么你觉得需要这样做? – doctorlove

+1

感谢您的快速回答。我必须重复命令使用相同的参数来查看它第二次被拒绝,所以我用不同的通过条件第二次写测试 This first c ommand正在使用当前时间填写发送的参数之一。在第二次测试中发送命令时,我需要这个完全相同的参数。 – Pierre

回答

1

docs说清楚

测试用例被构造为与 一个新实例中运行每种方法的测试类

如果需要的实际时间的参数设置为你正在测试的函数,为什么不写一个设置状态的测试,调用你的函数一次,并声明它通过然后再次调用,如果失败则声明?

def test_that_two_calls_to_my_method_with_same_params_fails(self): 
    var1 = 1 
    varg = 1 
    assert myMethod(var1, varg) 
    assert myMethod(var1, varg) == False 

我认为这是更清楚的,因为一个测试将所有状态放在一起,并且可以以任何顺序运行测试。

你可能会争辩它,因为你试图使用安装方法。该文档还说

测试模块是一个python模块,它匹配testMatch常规 表达式。测试模块提供模块级设置和拆卸;定义 用于设置的方法设置,setup_module,setUp或setUpModule,拆除teardown,teardown_module或tearDownModule。

所以,你的类外有

def setup_module() 
    #bother now I need to use global variables 
    pass 
+0

谢谢!我为了“收益”而不是断言看到结果是分开的。 – Pierre