gpt4 book ai didi

python - unittest teardown() 删除所有属性

转载 作者:太空狗 更新时间:2023-10-29 22:11:10 30 4
gpt4 key购买 nike

我有设置和拆卸方法的单元测试,如下所示:

def setUp(self):
self.foo = "bar"
self.bar = "foo"

def tearDown(self):
del self.foo
del self.bar

有没有更简洁的方法来调用 __del__ 我在 setUp 中实例化的每个对象?如果我不这样做,那么在 setUp(通过实例化这些对象)中打开的 MySQL 数据库的连接似乎在每次测试后都保持打开状态。

理想情况下 我当然会弄清楚潜在的问题(为什么在测试完成并且测试用例被丢弃时那些数据库连接没有被关闭)。但与此同时,是否有一种更简洁的方法来删除所有这些对象?

数据库连接是使用MySQLdb库创建的,还有一个关闭连接的析构函数:

class Foo(object):

def __init__(self,some_credentials):
self.db_connection = MySQLdb.connect(some_credentials)

def __del__(self):
self.db_connection.close()

最佳答案

这里的潜在问题是每个python单元测试在每个测试用例运行后都不会丢弃测试实例。实例保存在内存中,因此分配给 self 的任何对象也保存在内存中,直到整个套件完成。

您可以使用以下代码重现此内容。内存使用量将随着运行的每个额外测试而增加。如果在 teardown 中将 self.large_list 设置为 None,则内存使用保持一致。

import resource
import unittest
import uuid


class TestSelfGarbageCollection(unittest.TestCase):

def setUp(self):
# Create an object that will use lots of memory
self.large_list = []
for _ in range(300000):
self.large_list.append(uuid.uuid4())

def tearDown(self):
# Without the following line a copy of large_list will be kept in
# memory for each test that runs, uncomment the line to allow the
# large_list to be garbage collected.
# self.large_list = None
mb_memory = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000
print("Memory usage: %s MB" % mb_memory)

def test_memory1(self):
pass

def test_memory2(self):
pass

def test_memory3(self):
pass

def test_memory4(self):
pass

def test_memory5(self):
pass

运行:

py.test test_large_memory.py -s -v

最简单的解决方案是显式清除分配给 self 的任何大型对象或 tearDown 中需要清除的任何对象(例如数据库连接)。

引用资料:
Python’s leaky TestCase
Issue 11798: Test cases not garbage collected after run - Python tracker

关于python - unittest teardown() 删除所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26915115/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com