测试对象的初始化并使用它

时间:2014-12-16 12:59:29

标签: python unit-testing python-unittest

我有一个课程,我想用内置的unittest模块测试它。特别是我想测试我是否可以创建intances而不会抛出错误,如果我可以使用它们。

问题是这个对象的创建速度很慢,所以我可以在setUpClass方法中创建对象并重用它们。

@classmethod
def setUpClass(cls):
    cls.obj = MyClass(argument)

def TestConstruction(self):
    obj = MyClass(argument)

def Test1(self):
    self.assertEqual(self.obj.metohd1(), 1)

重点是

  1. 我创造了昂贵物品的2倍
  2. setUp是TestConstruction之前的calles,所以我无法检查TestConstruction
  3. 中的失败

    如果有办法在其他测试之前设置TestConstruction,我会很高兴。

1 个答案:

答案 0 :(得分:2)

为什么不在同一测试中测试初始化​​和功能?

class MyTestCase(TestCase):
    def test_complicated_object(self):
        obj = MyClass(argument)
        self.assertEqual(obj.method(), 1)

或者,您可以对案例对象初始化进行一次测试,对其他测试进行一次测试用例。这意味着你必须创建两次对象,但这可能是一个可接受的权衡:

class CreationTestCase(TestCase):
    def test_complicated_object(self):
        obj = MyClass(argument)

class UsageTestCase(TestCase):
    @classmethod
    def setupClass(cls):
        cls.obj = MyClass(argument)

    def test_complicated_object(self):
        self.assertEqual(obj.method(), 1)

请注意,如果您使用方法改变对象,那么您将遇到麻烦。

或者,您可以这样做,但我再也不建议

class MyTestCase(TestCase):
    _test_object = None

    @classmethod
    def _create_test_object(cls):
        if cls._test_object is None:
            cls._test_object = MyClass(argument)
        return cls._test_object

    def test_complicated_object(self):
        obj = self._create_test_object()
        self.assertEqual(obj.method(), 1)

    def more_test(self):
        obj = self._create_test_object()
        # obj will be cached, unless creation failed