我的测试设置:
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。
答案 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
以延长寿命。