在Python中测试私有方法(异常)

2024-04-24 05:22:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在阅读了关于在Python中测试私有方法的内容后,特别是在:How do I unit test the methods in a method object?中引用了接受的答案,似乎最好只测试公共接口。然而,我的班级看起来是这样的:

class MyClass:

  def __init__(self):
    # init code

  def run(self):
    self.__A()
    self.__B()
    self.__C()
    self.__D()

  def __A(self):
    # code for __A

  def __B(self):
    # code for __B

  def __C(self):
    # code for __C

  def __D(self):
    # code for __D

本质上,我创建了一个类,用于通过函数管道处理一些输入数据。在这种情况下,最好是测试私有函数,而不是测试公共run()函数吗?最好的方法是什么?


Tags: the方法函数runtestself内容for
3条回答

首先,你不是吗?(或者我在这里遗漏了什么?)

>>> class MyClass(object):
...     def __init__(self):
...             pass
...     def __A(self):
...             print('Method __A()')
... 
>>> a=MyClass()
>>> a
<__main__.MyClass object at 0x101d56b50>
>>> a._MyClass__A()
Method __A()

但是,如果您必须测试内部内容,则可以始终在MyClass中编写测试函数:

class MyClass(object):
    ...
    def _method_for_unit_testing(self):
        self.__A()
        assert <something>
        self.__B()
        assert <something>
        ....

当然,这不是最优雅的方法,但它只是类底部的几行代码。

或许你应该测试一下run()方法。大多数类都有内部方法——在这种情况下,__A()__B()__C,()__D()中的所有代码是否实际在run()中并不重要。如果怀疑或发现问题,则可能需要切换到调试器方面并测试专用方法。

当Python将实际执行的代码放在一起时,它会对名称进行一些处理。因此,如果在MyClass上有一个私有方法__A,则需要在单元测试中像这样运行它:

class TestMyClass(unittest.TestCase):
    expected = 'myexpectedresult'
    m = MyClass()
    actual = m._MyClass__A
    self.assertEqual(expected, actual)

相关问题 更多 >