用于模型类的Python单元测试

时间:2018-08-18 20:29:27

标签: python unit-testing pytest

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

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

我知道这个问题被标记为可能重复,但是另一个问题是值的构造函数设置。在这个特定问题中,我们仅设置一个值,但还有三个其他变量也被设置为默认值。我认为,如果在重构过程中变量混合在一起,则应该进行单元测试,但是我希望其他人也能提出意见。

2 个答案:

答案 0 :(得分:1)

我已经将def __init__(self): self.data = [1, 2]更改为self.data = [1, 2],,这引起了奇怪的错误,我希望我有type__init__()的值检查。

答案 1 :(得分:0)

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

使用为成员分配参数的构造函数会更好一些,因为您不会将任何硬编码的值复制到测试中。尽管如此,其复杂性仍然很低,可以与设置器和获取器相媲美。

对于这种琐碎的构造函数,我将尝试受益于以下事实:必须无论如何都要调用构造函数以测试该类的任何其他方法。然后可以用它来创建测试用例,其中构造后的初始值会影响测试结果。

在您的情况下,可以编写一个不同的测试用例:用{{1}调用构造函数,而不是在构造函数设置score_threshold的情况下编写专用测试,然后检查是否实际设置了阈值。 },然后尝试将分数增加到该阈值以上。在这里,构造函数不仅是经过单独测试的,而且是(稍大)用例的一部分。

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