在Python中测试私有方法(例外)

时间:2013-03-16 18:53:27

标签: python unit-testing

在阅读了关于在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()函数吗?这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

首先,你CAN access the "private" stuff,不是吗? (或者我在这里遗漏了什么?)

>>> 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>
        ....

确保这不是最优雅的方式,但是在课程底部只有几行代码。

答案 1 :(得分:1)

Python将实际执行的代码放在一起时会进行一些名称修改。因此,如果您在__A上拥有私有方法MyClass,则需要在单元测试中运行它:

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

答案 2 :(得分:0)

可能你应该只测试run()方法。大多数类都有内部方法 - 在这种情况下,__A()__B()__C,()__D()中的所有代码是否实际存在并不重要是run()还是不。如果您怀疑或发现问题,那么您可能希望切换到调试器方面并测试私有方法。

相关问题