如果设置类的公共属性,您是不是对 __init__ 方法进行单元测试?
Posted
技术标签:
【中文标题】如果设置类的公共属性,您是不是对 __init__ 方法进行单元测试?【英文标题】:Do you unit test __init__ method if it sets up public attributes of a class?如果设置类的公共属性,您是否对 __init__ 方法进行单元测试? 【发布时间】:2018-03-28 22:05:47 【问题描述】:我正在尝试应用 Sandi Metz 的规则,即仅对真正影响对象公共方面的消息进行单元测试,并通过测试公共内容来间接测试所有私有内容。
因此我们避免测试实现并且可以随时更改它。
我的问题是:如果我的__init__
方法设置了公开可用的实例属性,我是否也应该对其进行单元测试。
我基本上不确定是否应该将 init 视为私有方法(并且相信如果它设置了公共内容,则应该进行单元测试)。
例子:
MyClass(object):
def __init__(self, public_parameter_1, public_param_2)
self.public_parameter_1 = public_parameter_1
self.public_parameter_2 = public_parameter_2
使用pytest的测试:
def test_instance():
instance = MyClass(1, 2)
assert instance.public_parameter_1 == 1
assert instance.public_parameter_2 == 2
【问题讨论】:
【参考方案1】:这有点棘手,因为 Python 并没有真正的私有属性。我想您可以测试不以下划线开头的所有内容,或者您可以测试所有内容,但我通常限制自己测试需要一些计算或逻辑的东西。在您给出的示例中,我不会费心测试这两个简单的任务。
如果您想检查您的 __init__()
方法,您可以使用某种 linting 工具来检查您在其他方法中访问的所有属性是否在 __init__()
期间分配了一个值。这可能比为所有属性编写显式测试更有效。
【讨论】:
对测试 init 有同样的问题。这个答案对我来说很有意义,但是为了澄清一点......在我看来,如果它只是分配值,那么 init 在你测试它的方法或子类时可能会固有地被测试。但是,如果其中包含条件逻辑,您可能需要显式测试它以确保条件逻辑正常运行。以上是关于如果设置类的公共属性,您是不是对 __init__ 方法进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章
python__基础 : 类的__init__,__str__,__del__方法