【发布时间】: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