Python单元测试:“自我”未定义

Gaa*_*ara 2 python nose python-2.7 python-unittest

我是新来的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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

  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
Run Code Online (Sandbox Code Playgroud)

我不确定为什么 self 在这里未定义。

Ale*_*all 5

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

(尽管 ifself等同于this它仍然没有意义,因为没有相关的实例,只有类)

当您处于类级别时,您可以正常使用类级别的其他变量。例如:

class A:
    x = 1
    y = 2
    z = x + y  # 3
Run Code Online (Sandbox Code Playgroud)

所以你可以删除self并只说'0' not in testcases.

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

global testcases_exec_list
testcases = []
testcases = testcases_exec_list
Run Code Online (Sandbox Code Playgroud)
  1. 该行testcases = []完全是多余的,因为您立即覆盖它。
  2. 该行global testcases_exec_list可能是无用的(取决于类定义的其余部分),因为global它用于分配,而不是访问。
  3. 如果你已经定义了,为什么testcases还要定义testcases_exec_list?您是否明白这使它们成为相同的列表,而不是复制?