2017-10-31 4 views
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_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') 
} 

だから私は、次の2つのオプションに直面しています単体テスト。ナンバーワンは、コピー貼り付けすべてで現実的なデータを持つことです。

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) 

ナンバー2には、ダミーデータを使用して簡単にすることである。

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) 

ナンバー2は、道より読みやすいですが、ナンバーワンは、より現実的です。どちらが優先され、なぜですか?

答えて

3

私は単純化されたユニットテストに賛成です。このコードの機能を変更する場合は、長くて複雑なものではなく、単純化された単体テストを更新する方がずっと簡単です。

単体テストの目的は、コードの小さなコンポーネントが基本レベルで動作して、現実的な期待される入力が最小限に抑えられているかどうかをチェックすることです。基本機能をチェックするための単体テストが複雑すぎると分かった場合は、その機能を小さなコンポーネントに分割することができます。この場合、私はあなたの機能が十分に簡単であると思っています。複雑なものよりも単純な単体テストより多くの利益を得るでしょう。しかし、この質問は間違いなく意見に基づくものです。

+1

"単体テストの目的は...コード作業[...]が簡単な入力であるかどうかをチェックすることです"という言葉はおそらく* trivial *という言葉を過大評価しています。単体テストでは、実際に渡される可能性のある入力に対して、テスト対象のコードが確実に動作するようにする必要があります。最も理想的な場合には、無意味なコードに対して責任あるエラーを投げることが含まれます。 –

関連する問題