单元测试数据应该简化还是现实?

2024-05-23 23:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想为以下Python函数编写一个单元测试:

def multiply(dict_1, dict_2):
    result = {}
    for (key_1, key_2) in dict_1:
        result[(key_1, key_2)] = dict_1[(key_1, key_2)] * dict_2[key_2]
    return result

dict_1dict_2是其他函数的输出。它们不长,但看起来有点复杂:

dict_1 = {
        ('Nietzsche', 'USR1'): Decimal('0E-8'),
        ('Nietzsche', 'PKILL'): Decimal('1.49177787'),
        ('Nietzsche', 'RM'): Decimal('10971.22182930'),
        ('Nietzsche', 'LS'): Decimal('4.44771349'),
        ('Nietzsche', 'NCDU'): Decimal('5.14671343'),
        ('Nietzsche', 'SUDO'): Decimal('9.49572673'),
        ('Nietzsche', 'PS'): Decimal('0.57328494'),
        ('Hegel', 'USR1'): Decimal('0E-8'),
        ('Marx', 'NCDU'): Decimal('0E-8'),
        ('Marx', 'SUDO'): Decimal('0E-8'),
        ('Marx', 'PS'): Decimal('0E-8'),
        ('Marx', 'LS'): Decimal('0E-8'),
        ('Marx', 'PKILL'): Decimal('0E-8')
    }
dict_2 = {
        'USR1': Decimal('6357.48'),
        'PKILL': Decimal('307.277'),
        'RM': Decimal('88.232'),
        'LS': Decimal('71.1787'),
        'NCDU': Decimal('0.0389333'),
        'SUDO': Decimal('199.979'),
        'PS': Decimal('307.277')
    }

这些特定参数的函数输出看起来也有点复杂:

{
    ('Nietzsche', 'USR1'): Decimal('0E-10'),
    ('Nietzsche', 'PKILL'): Decimal('458.38902855999'),
    ('Nietzsche', 'RM'): Decimal('968012.84444279760'),
    ('Nietzsche', 'LS'): Decimal('316.582464190663'),
    ('Nietzsche', 'NCDU'): Decimal('0.200378537984219'),
    ('Nietzsche', 'SUDO'): Decimal('1898.94593573867'),
    ('Nietzsche', 'PS'): Decimal('176.15727650838'),
    ('Hegel', 'USR1'): Decimal('0E-10'),
    ('Marx', 'NCDU'): Decimal('0E-15'),
    ('Marx', 'SUDO'): Decimal('0E-11'),
    ('Marx', 'PS'): Decimal('0E-11'),
    ('Marx', 'LS'): Decimal('0E-12'),
    ('Marx', 'PKILL'): Decimal('0E-11')
}

所以我面临两个单元测试的选择。第一是通过复制粘贴所有内容来获得真实的数据:

def test_multiply_1(self):
    dict_1 = {
        ('Nietzsche', 'USR1'): Decimal('0E-8'),
        ('Nietzsche', 'PKILL'): Decimal('1.49177787'),
        ('Nietzsche', 'RM'): Decimal('10971.22182930'),
        ('Nietzsche', 'LS'): Decimal('4.44771349'),
        ('Nietzsche', 'NCDU'): Decimal('5.14671343'),
        ('Nietzsche', 'SUDO'): Decimal('9.49572673'),
        ('Nietzsche', 'PS'): Decimal('0.57328494'),
        ('Hegel', 'USR1'): Decimal('0E-8'),
        ('Marx', 'NCDU'): Decimal('0E-8'),
        ('Marx', 'SUDO'): Decimal('0E-8'),
        ('Marx', 'PS'): Decimal('0E-8'),
        ('Marx', 'LS'): Decimal('0E-8'),
        ('Marx', 'PKILL'): Decimal('0E-8')
    }
    dict_2 = {
        'USR1': Decimal('6357.48'),
        'PKILL': Decimal('307.277'),
        'RM': Decimal('88.232'),
        'LS': Decimal('71.1787'),
        'NCDU': Decimal('0.0389333'),
        'SUDO': Decimal('199.979'),
        'PS': Decimal('307.277')
    }
    expected = {
        ('Nietzsche', 'USR1'): Decimal('0E-10'),
        ('Nietzsche', 'PKILL'): Decimal('458.38902855999'),
        ('Nietzsche', 'RM'): Decimal('968012.84444279760'),
        ('Nietzsche', 'LS'): Decimal('316.582464190663'),
        ('Nietzsche', 'NCDU'): Decimal('0.200378537984219'),
        ('Nietzsche', 'SUDO'): Decimal('1898.94593573867'),
        ('Nietzsche', 'PS'): Decimal('176.15727650838'),
        ('Hegel', 'USR1'): Decimal('0E-10'),
        ('Marx', 'NCDU'): Decimal('0E-15'),
        ('Marx', 'SUDO'): Decimal('0E-11'),
        ('Marx', 'PS'): Decimal('0E-11'),
        ('Marx', 'LS'): Decimal('0E-12'),
        ('Marx', 'PKILL'): Decimal('0E-11')
    }
    actual = multiply(dict_1, dict_2)
    self.assertEqual(actual, expected)

第二是使用虚拟数据来简化:

def test_multiply_1(self):
    dict_1 = { ('Nietzsche', 'PKILL'): Decimal('1.49177787') }
    dict_2 = { 'PKILL': Decimal('307.277') }
    actual = multiply(dict_1, dict_2)
    expected = { ('Nietzsche', 'PKILL'): Decimal('458.38902855999') }
    self.assertEqual(actual, expected)

第二个更具可读性,但第一个更现实。哪一个是首选的?为什么


Tags: keyrmselfsudolsdictmultiplyps
1条回答
网友
1楼 · 发布于 2024-05-23 23:21:58

我倾向于简化单元测试。如果您决定更改此代码的功能,那么更新简化的单元测试要比更新冗长复杂的单元测试容易得多

除此之外,单元测试的目的是检查代码的小组件是否在其基本级别上工作,以获得实际的预期输入,并将复杂性降低到最小程度。如果您发现检查基本功能的单元测试太复杂,您可能需要将功能本身拆分为更小的组件。在这种情况下,我认为您的功能已经足够简单了,您将从简单的单元测试中获益,而不是从复杂的单元测试中获益。然而,这个问题绝对是基于意见的

相关问题 更多 >