清除单元测试用例的导入模块的正确方法是什么?

时间:2014-04-01 12:08:01

标签: python python-import python-unittest

我正在对模块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)为什么这种方法需要这种三重模式' ' import',' reload'和'来自模块导入'? (它是基于错误消息的猜测开发的)

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

... ...后
TheoretiCAL 响应和进一步的研究之后,我认为正确的pythonic方法是在fixture中显式或隐式删除超类对象† #39;拆解。 如果它是隐式的,那么unittest需要修改。如果它是显式的,那么我需要添加一个带有Pigso.destroy.__superclass__()的tearDown方法。据我所知,Python中尚未提供该功能。 我确实认为在unittest import部分和fixture setUp中组织删除超类对象既不是pythonic也不符合单元测试的核心设计概念。

我很想听听别人的声音。对此的观察尤其是关于如何实施Pigso.destroy.__superclass__的想法。

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

1 个答案:

答案 0 :(得分:0)

  1. 大局是所有单元测试应该彼此独立运行,这就是为什么你有一个在每个测试用例运行之前调用的设置函数。您已在设置中重新加载,因为没有它,如果模块状态发生变化,您的测试将不再是独立的。你的from语句来检索你的对象是不可避免的。

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