为什么 Python nose unittest 的 teardown fixture 失败了
我正在使用 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 连接。