【问题标题】:Python Unit Test for Model Class模型类的 Python 单元测试
【发布时间】:2018-08-18 20:29:26
【问题描述】:

假设我们有一个模型类用于跟踪欺诈检查:

class FraudCheck(object):

    def __init__(self, score_threshold):
        self.score = None
        self.transaction = None
        self.is_fraud = True
        self.score_threshold = score_threshold

我们应该为此__init__ 方法编写单元测试吗?类中还有其他方法。

所以我们应该编写类似于以下的测试:

@pytest.fixture()
def fraud_data():
    account = FraudCheck(
        1000
    )
    return account


def test_fraud_data(fraud_data):
    assert fraud_data.score is None
    assert fraud_data.transaction is None
    assert fraud_data.is_fraud
    assert fraud_data.score_threshold == 10

我知道这个问题被标记为可能重复,但另一个问题是构造函数设置值。在这个特定的问题中,我们只设置一个值,但还有其他三个变量也设置为默认值。如果变量在重构过程中混淆,我认为单元测试是合适的,但我想听听其他人的意见。

【问题讨论】:

标签: python unit-testing pytest


【解决方案1】:

我有一个 def __init__(self): self.data = [1, 2] 通过魔术触摸更改为 self.data = [1, 2],,它导致了奇怪的错误,我希望我有一个 type__init__() 的值检查。

【讨论】:

    【解决方案2】:

    将成员设置为硬编码值的简单构造函数测试的问题在于,它们会导致源代码重复:在代码中将成员设置为“a”,在测试中检查成员是否为“一个'。如果更改代码,则必须更改测试。

    将参数分配给成员的构造函数会稍微好一些,因为您不会将任何硬编码值复制到测试中。尽管如此,复杂度还是很低,可以与 setter 和 getter 相媲美。

    对于这种微不足道的构造函数,我会尝试从构造函数必须被调用以测试类的任何其他方法这一事实中受益。然后可以使用它来创建测试用例,其中构造后的初始值会对测试结果产生影响。

    在您的情况下,不是编写一个专用测试,其中构造函数设置 score_threshold 然后检查该阈值是否实际设置,您可以有一个不同的测试用例:使用 score_threshold 调用构造函数,然后尝试将分数增加到该阈值以上。在这里,构造函数不仅仅是单独测试的,它是一个(稍微)更大的用例的一部分。

    显然,如果构造函数有更多逻辑,例如由于输入无效而引发异常的场景,则情况不同。然后,对构造函数进行专门的测试就有意义了。

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 2019-06-21
      • 2015-06-24
      • 2017-12-19
      • 2010-12-26
      相关资源
      最近更新 更多