在阅读了关于在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()
函数吗?这样做的最佳方式是什么?
答案 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()
还是不。如果您怀疑或发现问题,那么您可能希望切换到调试器方面并测试私有方法。