我使用安装和解压缩方法进行单元测试,这些方法如下所示:
def setUp(self):
self.foo = "bar"
self.bar = "foo"
def tearDown(self):
del self.foo
del self.bar对于我在setUp中实例化的每个对象,是否有一种更简洁的方法来调用setUp?如果我不这样做,那么在每次测试之后(通过实例化这些对象)打开到MySQL数据库的连接似乎仍然是打开的。
理想情况下,我当然会找出潜在的问题(为什么当测试结束和测试用例被丢弃时,这些数据库连接没有被关闭)。同时,是否有一种更干净的方法来del所有这些对象?
数据库连接是使用MySQLdb库创建的,还有一个析构函数来关闭连接:
class Foo(object):
def __init__(self,some_credentials):
self.db_connection = MySQLdb.connect(some_credentials)
def __del__(self):
self.db_connection.close()发布于 2016-01-25 20:09:01
这里的基本问题是,每个python单元测试在每个测试用例运行后都不会丢弃测试实例。实例保存在内存中,因此分配给self的任何对象也保存在内存中,直到整个套件完成为止。
您可以使用以下代码再现此代码。每运行一次额外的测试,内存的使用量就会增加。如果在self.large_list中将None设置为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中的数据库连接)。
参考资料:
问题11798:运行后收集的测试用例不是垃圾- Python
发布于 2014-11-13 17:47:24
您根本不需要删除所有这些属性。
TestCase实例最终将在tearDown之后被丢弃;每个测试都使用一个新鲜的、干净的、闪亮的、最重要的是空的新实例来运行。实例上的任何属性都将被清除,一旦测试套件运行,引用计数就会下降,如果实例是对这些值的唯一引用,它们就会从内存中消失。
引用文档的话
类unittest.TestCase(methodName='runTest')
TestCase类的实例表示最单位宇宙中最小的可测试单元。……TestCase的每个实例都将运行一个测试方法:名为methodName的方法。
强调我的;测试运行程序将创建这些实例,传递要运行的测试方法的名称;如果您有test_foo和test_bar方法,那么将创建传递这些名称的实例。
一定要使用tearDown清除测试实例之外的内容;删除临时文件、删除模拟修补程序、关闭数据库连接等等。TestCase实例只有在所有测试运行完毕后才能完成(从内存中删除),因为测试运行程序可能希望稍后访问每个测试,以便在完整套件运行结束时提供有关它们的详细信息。
发布于 2018-07-23 16:27:29
当我拥有teardown(self)时,我总是运行setUp(self)。这样可以防止“杀死9”错误积累过多的内存。通过将变量设置为None,在每个单元测试之后清除总内存。
class TestExample(unittest.TestCase):
def setUp(self):
self.example_var = "some small or large amount of data"
def teardown(self):
self.example_var = Nonehttps://stackoverflow.com/questions/26915115
复制相似问题