【问题标题】:What is the correct way to clear down an imported module for a unittest case?清除单元测试用例的导入模块的正确方法是什么?
【发布时间】:2014-04-01 12:08:00
【问题描述】:

我正在模块 pigso 中对 Pigso 类进行单元测试。

class Pigso(object):

    _count = 0

    def __init__(self):
        self.__class__._count += 1
        self.ident = self.__class__._count


我设置了一个单元测试,目的是检查第三个 Pigso 对象是否具有 self.ident == 3。

import unittest
import pigso


class TestPigID(unittest.TestCase):

    def setUp(self):
        reload(pigso)
        from pigso import Pigso
        self.pig1 = Pigso()
        self.pig2 = Pigso()
        self.pig3 = Pigso()

    def test_dummy(self):
        self.assertEqual(2 + 2, 4)

    def test_pig_ident(self):
        self.assertEqual(self.pig3.ident, 3,
                         msg="Pigso 'ident' {0} should be 'ident' 3"
                         .format(self.pig3.ident))

我有两个问题:

1) 为什么这种方法需要这种“导入”、“重新加载”和“从模块导入”的“三重模式”的总体情况是什么? (它是根据错误信息猜测开发的)

2) 有没有更优雅的 Pythonic 方法?据我了解,unittest 方法要求为每个测试用例彻底清理和重建环境。如果我是正确的,那需要一种方法来将导入的单元和类恢复到它们首次加载到测试单元时的状态。

...稍后...
根据 TheoretiCAL 的 响应和更多进一步的研究,我认为正确的 Python 方法是在夹具的拆解中显式或隐式地删除超类对象†。 如果它是隐式的,那么 unittest 需要修改。如果它是明确的,那么我需要使用Pigso.destroy.__superclass__() 添加一个 tearDown 方法。据我所知,该功能在 Python 中尚不可用。
我确实认为在 unittest 导入部分和夹具 setUp 中组织删除超类对象既不符合 Python 风格,也不符合单元测试的核心设计概念。

我很想听听其他人对此的看法,尤其是关于如何实施 Pigso.destroy.__superclass__ 的想法。

†我对“超类对象”的理解是 _count 所在的地方。

【问题讨论】:

    标签: python python-import python-unittest


    【解决方案1】:
    1. 总体情况是所有单元测试都应该相互独立运行,这就是为什么您有一个在每个测试用例运行之前调用的设置函数。您已在设置中重新加载,因为没有它,如果模块的状态发生更改,您的测试将不再是独立的。检索对象的 from 语句是不可避免的。

    2. 如果您只检查缩进,则根据您提供的测试,您可以删除 test_dummy,确保只有 1 个测试用例,因此您可以删除 import 和 reload 语句。

    【讨论】:

    • 感谢您的帮助。 test_dummy 是此示例代码所必需的,它已减少到其他人测试或使用所需的最低限度。由于 unittest 的运行方式,test_dummy() 函数具有副作用。如果未正确删除 Pigso 超类对象,则将在 pig3.identtest_pig_identself.pig3.ident == 6 中测试之前创建六个 Pigso 对象,因此测试失败。
    • 你可以把reload放到teardown方法中......或者只是将类计数变量设置为零
    • 将 import module 和 reload(module) 语句重新定位到 tearDown 方法确实有效。这对阅读代码的任何人也很有帮助,因为它将语句与拆卸过程联系起来。我对在 tearDown 方法中重置单个类属性感到不舒服。例如:如果测试夹具 A 清除了它自己的类属性,但具有改变测试夹具 B 中使用的类属性的副作用,则 B 无法在单元测试所需的隔离下运行。
    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多