Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单元测试数据应该简化还是现实?_Python_Unit Testing - Fatal编程技术网

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

Python 单元测试数据应该简化还是现实?,python,unit-testing,Python,Unit Testing,假设我想为以下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_1和dict_2是其他功能的输出。它们不长,但看起来有点复杂: dict_1 = {

假设我想为以下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_1
dict_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')
}
这些特定参数的函数输出看起来也有点复杂:

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)

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

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


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

“单元测试的目的是检查……代码是否工作……用于琐碎的输入”可能夸大了琐碎这个词。单元测试应该确保被测试的代码对任何可能实际通过的输入都有效。在最理想的情况下,这应该包括为无意义的代码抛出负责任的错误。