如果设置类的公共属性,您是不是对 __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__方法

python 类 四 : 类的继承与覆盖父类方法

__init__方法,类的实例化,对象

面向对象三大特性之封装与多态

我们可以为 Python 类的不同别名设置不同的 __name__ 属性吗?

python-子类构造函数调用super().__init__()