python - 如何使用模块级上下文管理器进行测试?

标签 python

我们的数据库连接代码包装在上下文管理器中。它很方便,因为您所要做的就是:

with db.transaction() as cursor:
    do_things_here()

它会为您处理错误时事务的所有嵌套和回滚。

但是,它给我带来了一些小问题,因为我想包装整个模块。我想我可以做这样的事情:

@pytest.fixture(scope='module')
def db():
    with db.transaction():
        yield db
        db.rollback()

但这不起作用 - pytest 说我无法从固定装置中屈服。

我们在底层使用 postgres 和 psycopg2。

有没有办法为整个模块使用上下文管理器,或者以其他方式解决我的问题?

我也尝试过做这样的事情:

@pytest.fixture(scope='module')
def db(request):
    cursor = db.transaction()

    def teardown():
        cursor.__exit__(None, None, None)

    request.addfinalizer(teardown)

但是 contextmanager 装饰器不喜欢这样。

最后,我什至尝试了

with db.transaction(force_rollback=True):
    def test_my_things():
         db.execute('CREATE TABLE castle_auuurrrhhgggg;')

但是执行两次失败,因为该表存在。

但是,如果我这样做:

def test_my_things():
    with db.transaction(force_rollback=True) as cursor:
         cursor.execute('CREATE TABLE knights_who_say_ni;')

效果很好。

关于如何在测试结束时回滚所有内容,有什么想法吗?

最佳答案

如果您使用 yieldfixture它应该可以与您的初次尝试配合使用,而不是常规的装置

关于python - 如何使用模块级上下文管理器进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026914/

相关文章:

python - 运行ffmpeg而不输出配置信息?

python - 重复二维数组的行

python - 用 Pandas 阅读excel专栏

python - 为什么这个 opencl 代码是不确定的?

python - 在 python 中做散点图时标记数据

python - 用另一个字典中的键替换字典的值

python - 如何从 pydatatable 数据框中删除列列表?

python - 如何检测Python中未解码的字符?

c++ - Boost::Python 中的智能指针转换

python - 使用 python 在 linux 上运行 phantomjs