为什么 Python nose unittest 的 teardown fixture 失败了

0 投票
2 回答
810 浏览
提问于 2025-04-16 05:22

我正在使用 nose 测试框架。当我运行一个测试模块时,里面定义的清理函数失败了。错误信息显示这个资源被另一个进程锁住了。以下是我的测试模块 test_my_module.py

... ...    
def teardown():
    if os.path.exists(test_output_dir):
        shutil.rmtree(test_output_dir)
... ...

@with_setup(init_test_db, destroy_test_db)
def test_foo1():
    eq_(foo1(),1)

@with_setup(init_test_db, destroy_test_db)
def test_foo2():
    eq_(foo2(),2)
... ...

test_output_dir 目录下有一个数据库(sqlite3)文件,它被用作测试的资源。实际上,正是这个数据库文件无法被清理函数删除,因为它被其他进程锁住了。根据我的理解,清理函数应该在所有测试函数运行完后执行。那么为什么会出现这种情况呢?为什么那些测试函数仍然会锁住这个数据库文件?这是sqlite3的问题,还是我的测试代码有问题呢?

2 个回答

0

我觉得我在我的C#单元测试中也遇到过同样的问题。

我通过在删除数据库文件之前调用SqliteConnection.ClearAllPools()来解决这个问题,所以这和连接池有关。

也许在Python中有类似的方法?我真的不太清楚。

0

你可以在删除 test_output_dir 之前,先在清理阶段明确地关闭 sqlite 连接。

撰写回答