Python unittest:'self'未定义

时间:2017-07-05 22:34:42

标签: python python-2.7 python-unittest nose

我是unittest的新手。我试图根据列表中的值跳过测试用例。

class UESpecTest(unittest.TestCase):
    global testcases_exec_list
    testcases = []
    testcases = testcases_exec_list
    @unittest.skipIf('0' not in self.testcases, "Testcase input not given")
    def test_retrieve_spec_info(self):
        read_spec_info.open_csv(self.spec_info)
        assert (bool(self.spec_info) == True) #Raise assertion if dictionary is empty

我收到以下错误

  File "test_ue_cap_main.py", line 39, in UESpecTest
    @unittest.skipIf('0' not in self.testcases, "Testcase input not given") 
NameError: name 'self' is not defined

我不确定为什么这里的自我未被定义。

2 个答案:

答案 0 :(得分:3)

self不是像Java和Javascript中的this这样的神奇变量。这就是为什么你必须将它定义为方法中的第一个参数。如果未将self定义为参数或其他类型的变量,则不会像任何其他变量那样定义它。它的名字纯粹是传统的。

(虽然如果self等同于this,它仍然没有意义,因为没有相关的实例,只有课程)

当你在班级时,你可以正常使用班级的其他变量。例如:

class A:
    x = 1
    y = 2
    z = x + y  # 3

因此,您可以删除self,然后只说'0' not in testcases

此外,你还有一些奇怪的事情发生了:

global testcases_exec_list
testcases = []
testcases = testcases_exec_list
  1. testcases = []完全是多余的,因为您会立即覆盖它。
  2. global testcases_exec_list可能无用(取决于类定义的其余部分),因为global用于分配,而不是访问。
  3. 如果您已经testcases,为什么定义testcases_exec_list?你明白这会使它们成为同一个列表,而不是制作副本吗?

答案 1 :(得分:1)

self未定义,因为self不存在。在课程定义时,尚未创建self。 Python创建self的唯一时间是在类的实例上调用绑定方法时。 self仍然是Python隐式传递给绑定方法的普通变量。

因此,在您的情况下,您不需要self,只需按原样使用testcase

@unittest.skipIf('0' not in testcases, "Testcase input not given")

当在类的命名空间内时,那里定义的变量可以正常使用,就好像它们是全局的一样:

>>> class Class:
    attr1 = 0
    print(attr1)


0
>>>