如果setup_class失败,如何在pytest中清理?

时间:2018-10-08 12:39:53

标签: python python-2.7 pytest

我的测试设置:

class TestClass:
    @classmethod
    def setup_class(cls):
       create_table(tb1)
       create_table(tb2)

    @classmethod
    def teardown_class(cls):
       drop_table(tb1)
       drop_table(tb2)   

    def setup_method(self, method):
        func()

    def teardown_method(self, method):
        func()

    def test_tc1(self):
        <tc_content>
        assert 

以上模块未能在setup_class中创建表tb2,但成功创建了表tb1。它存在错误,但没有执行teardown_class。 下次运行模块时,这会产生错误“表tb1存在”。 即使无法创建tb2,也可以在退出模块之前删除tb1。

1 个答案:

答案 0 :(得分:0)

为了说明如何重构代码以使用固定装置:

import pytest


@pytest.fixture(name='database_with_tables', scope='module')
def _database_with_tables():
    try:
        create_table(tb1)
        create_table(tb2)
        yield None # usually we would pass around a database connection / session
    finally:
        drop_table(tb1)
        drop_table(tb2)


@pytest.mark.usefixtures("database_with_tables")
class TestClass:
    def test_tc1(self):
        <tc_content>
        assert 

您仍然需要处理在表创建期间引发的异常。在大多数情况下,您还希望将数据库连接传递给测试方法,在这种情况下,不再需要pytest.mark.usefixtures。固定装置的优点在于,它声明了您需要进行测试的内容,而不是方法的内容。也可以将scope参数设置为session以延长寿命。