PyTest teardown_class运行得太早

时间:2018-06-27 19:40:33

标签: python google-bigquery pytest teardown

Python“ teardown_class”的行为不符合我的预期。以下是我的代码摘要:

@classmethod
def setup_class(cls):
    cls.create_table(table1)
    cls.create_table(table2)
    cls.create_table(table3)

@classmethod
def create_table(cls, some_arg_here):
    """Some code here that creates the table"""

def test_foo(self):
    """Some test code here"""

@classmethod
def teardown_class(cls):
    """Perform teardown things"""

我相信它的执行方式是:

  1. 使用设置的第一个参数(table1)调用create_table
  2. create_table中的代码执行
  3. teardown_class中的代码执行
  4. 上面的
  5. 1-3使用第二个参数
  6. 再次执行 再次
  7. 1-3使用第三个参数再次执行
  8. test_foo中的代码执行

我希望它如何执行:

  1. 使用第一个参数(table1)调用create_table
  2. create_table中的代码执行
  3. 使用第二个参数(表2)调用create_table
  4. create_table中的代码执行
  5. 使用第3个参数(表3)调用create_table
  6. create_table中的代码执行
  7. test_foo中的代码执行
  8. teardown_class中的代码执行

Python 2.7.10,pytest-3.6.2,py-1.5.3,pluggy-0.6.0

2 个答案:

答案 0 :(得分:1)

您的课堂方法错过了cls参数:

@classmethod
def create_table(some_arg_here):
    """Some code here that creates the table"""

将其更改为

@classmethod
    def create_table(cls, some_arg_here):

我修改了您的代码并添加了一些图片:

class TestClass:

    @classmethod
    def setup_class(cls):
        print("Setting up")
        cls.create_table('table1')
        cls.create_table('table2')
        cls.create_table('table3')

    @classmethod
    def create_table(cls, some_arg_here):
        print("Creating:", some_arg_here)
        """Some code here that creates the table"""

    def test_foo(self):
        print('Running test_foo')
        """Some test code here"""

    @classmethod
    def teardown_class(cls):
        print("Tearing down")
        """Perform teardown things"""

如果使用-s运行它,将得到以下结果:

test.py Setting up
Creating: table1
Creating: table2
Creating: table3
Running test_foo
.Tearing down

如您所见,一切正常。调用setup_class,创建表(共3个),运行测试方法,然后启动teardown_class。

如果添加函数test_bar(),则会得到:

test.py Setting up
Creating: table1
Creating: table2
Creating: table3
Running test_foo
.Running test_bar
.Tearing down

似乎对我也没问题。

您是否有其他提示来做些假设?

答案 1 :(得分:0)

我能够找到解决方案。我在create_table函数内部将setup函数重新创建为内部函数。

@classmethod
def setup_class(cls):
    def create_table(some_arg_here):
       """Some code here that creates the table"""

    create_table(table1)
    create_table(table2)
    create_table(table3)

def test_foo(self):
    """Some test code here"""

@classmethod
def teardown_class(cls):
    """Perform teardown things"""

现在,它按照我的预期运行,顺序如下:

  1. 为table1参数运行一次create_table
  2. 为table2参数运行一次create_table
  3. 为table3参数运行一次create_table
  4. 运行test_foo
  5. 运行teardown_class

似乎每次setup调用setup之外的函数时,都会导致teardown函数在之后直接运行外部函数中的代码运行,这就是我面临的问题。