环境 烧瓶0.10.1 SqlAlchemy 1.0.10 Python 3.4.3
使用unittest
我创建了两个单独的测试,其目标是通过700k记录查看数据库并进行一些字符串查找。当一次执行一个测试时,它可以正常工作,但是当整个脚本执行时:
python name_of_script.py
退出" KILLED"在随机的地方。
两个测试的主要代码都是这样的:
def test_redundant_categories_exist(self):
self.assertTrue(self.get_redundant_categories() > 0, 'There are 0 redundant categories to remove. Cannot test removing them if there are none to remove.')
def get_redundant_categories(self):
total = 0
with get_db_session_scope(db.session) as db_session:
records = db_session.query(Category)
for row in records:
if len(row.c) > 1:
c = row.c
#TODO: threads, each thread handles a bulk of rows
redundant_categories = [cat_x.id
for cat_x in c
for cat_y in c
if cat_x != cat_y and re.search(r'(^|/)' + cat_x.path + r'($|/)', cat_y.path)
]
total += len(redundant_categories)
records = None
db_session.close()
return total
另一个测试调用位于manager.py
文件中的函数,该函数执行类似操作,但在数据库中添加了批量删除。
def test_remove_redundant_mappings(self):
import os
os.system( "python ../../manager.py remove_redundant_mappings" )
self.assertEqual(self.get_redundant_categories(), 0, "There are redundant categories left after running manager.py remove_redundant_mappings()")
是否有可能在测试之间将数据保存在内存中?我不太明白如何单独执行测试,但是当背靠背运行时,过程以Killed结束。
有什么想法吗?
编辑(事情我试图无济于事):
manager.py
导入该功能,并在不使用os.system(..)
import gc
并在gc.collect()
之后和get_redundant_categories()
remove_redundant_mappings()
答案 0 :(得分:0)
在搜索高低时,我偶然发现了StackOverflow question/answer
中的以下评论我认为,正在发生的事情是,人们正在实例化会话而不是关闭会话。然后在不关闭会话的情况下对对象进行垃圾收集。当会话对象超出范围时,为什么sqlalchemy会话不会关闭自己,并且总是超出我的范围。 @ melchoir55
所以我将以下内容添加到正在测试的方法中:
db_session.close()
现在单元测试执行而不会被杀死。