首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unittest teardown() del all属性

Unittest teardown() del all属性
EN

Stack Overflow用户
提问于 2014-11-13 17:45:32
回答 3查看 8.4K关注 0票数 6

我使用安装和解压缩方法进行单元测试,这些方法如下所示:

代码语言:javascript
复制
def setUp(self):
   self.foo = "bar"
   self.bar = "foo"

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

对于我在setUp中实例化的每个对象,是否有一种更简洁的方法来调用setUp?如果我不这样做,那么在每次测试之后(通过实例化这些对象)打开到MySQL数据库的连接似乎仍然是打开的。

理想情况下,我当然会找出潜在的问题(为什么当测试结束和测试用例被丢弃时,这些数据库连接没有被关闭)。同时,是否有一种更干净的方法来del所有这些对象?

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

代码语言:javascript
复制
class Foo(object):

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

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-25 20:09:01

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

您可以使用以下代码再现此代码。每运行一次额外的测试,内存的使用量就会增加。如果在self.large_list中将None设置为None,则内存使用保持一致。

代码语言:javascript
复制
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

与:

代码语言:javascript
复制
py.test test_large_memory.py -s -v

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

参考资料:

Python的漏TestCase

问题11798:运行后收集的测试用例不是垃圾- Python

票数 9
EN

Stack Overflow用户

发布于 2014-11-13 17:47:24

您根本不需要删除所有这些属性。

TestCase实例最终将在tearDown之后被丢弃;每个测试都使用一个新鲜的、干净的、闪亮的、最重要的是空的新实例来运行。实例上的任何属性都将被清除,一旦测试套件运行,引用计数就会下降,如果实例是对这些值的唯一引用,它们就会从内存中消失。

引用文档的话

类unittest.TestCase(methodName='runTest') TestCase类的实例表示最单位宇宙中最小的可测试单元。……TestCase 的每个实例都将运行一个测试方法:名为methodName的方法。

强调我的;测试运行程序将创建这些实例,传递要运行的测试方法的名称;如果您有test_footest_bar方法,那么将创建传递这些名称的实例。

一定要使用tearDown清除测试实例之外的内容;删除临时文件、删除模拟修补程序、关闭数据库连接等等。TestCase实例只有在所有测试运行完毕后才能完成(从内存中删除),因为测试运行程序可能希望稍后访问每个测试,以便在完整套件运行结束时提供有关它们的详细信息。

票数 5
EN

Stack Overflow用户

发布于 2018-07-23 16:27:29

当我拥有teardown(self)时,我总是运行setUp(self)。这样可以防止“杀死9”错误积累过多的内存。通过将变量设置为None,在每个单元测试之后清除总内存。

代码语言:javascript
复制
class TestExample(unittest.TestCase):
    def setUp(self):
        self.example_var = "some small or large amount of data"

    def teardown(self):
        self.example_var = None
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26915115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档