Python:Nosetests:在运行时可以在setup_class方法中设置属性/标签吗?

时间:2014-02-05 19:42:04

标签: python nosetests

我想设置一个测试套件,其中我将在setup_class方法中读取一个json文件,在那个json文件中,我将提到应该运行哪些测试以及哪些测试不应该运行。因此,通过这种方法,我可以通过仅更改json文件而不是触及测试套件来提及要运行的测试用例。

但是当我尝试执行以下操作时,在setup_class方法中: -

class TestCPU:
    testme=False

    @classmethod
    def setup_class(cls):
       cls.test_core.testme=True

    def test_core(self):
       print 'Test CPU Core'
       assert 1

执行以下命令: -

   nosetests -s -a testme

它出现以下错误: -

   File "/home/murtuza/HWTestCert/testCPU.py", line 7, in setup_class
   cls.test_core.testme=False
   AttributeError: 'instancemethod' object has no attribute 'testme'

那么,是否可以在setup_class中设置测试方法的属性?

2 个答案:

答案 0 :(得分:1)

定义它的方式,testme是TestCPU类的成员,<unbound method TestCPU.test_core>不知道这个属性。您可以使用cls.test_core.__dict__['testme']=True注入nose属性。但是,在调用setup_class方法之前会检查属性,因此即使设置了属性,也会跳过测试。但是你可以使用导入属性装饰你的测试,如下所示:

import unittest

class TestCPU(unittest.TestCase):
    def test_core(self):
       print 'Test CPU Core'
       assert 1

TestCPU.test_core.__dict__['testme']=True

您可能还想尝试使用--pdb选项进行测试,它会在出错时调出调试器,以便您可以深入了解错误。这绝对是我生命中第二喜欢的事情。

答案 1 :(得分:0)

我确信有多种方法可以实现这一目标,但这是您可以采用的一种方法。

在测试类中,创建一个读取JSON文件的方法,并为要跳过测试的方法创建一个全局数组 - skiptests

您现在需要做的就是为套件中的每个测试用例方法使用一个设置装饰器。在此装饰器中,检查当前函数是否在skiptests中。如果是这样,请调用nosetests的自定义装饰器nose.tools.nottest,用于跳过测试。否则,返回正在测试的功能。

将其放入代码:

def setup_test_method1(func):
    if func.__name__ not in skiptests:
        return func
    else:
        return nose.tools.nottest(func)


@with_setup(setup_test_method1)
def test_method1():
    pass

我没有测试过这段代码,但我想我们可以在另一个装饰器中调用装饰器。在这种情况下,这可行。