У своїх тестових одиницях я часто кидаю довільні значення на свій код, щоб побачити, що він робить. Наприклад, якщо я знаю, що foo(1, 2, 3)
має повернутися 17, я можу написати це:
assertEqual(foo(1, 2, 3), 17)
Ці числа суто довільні і не мають ширшого значення (наприклад, це не є граничними умовами, хоча я і тестую їх). Я б намагався придумати хороші імена для цих номерів, і писати щось подібне const int TWO = 2;
явно не допомагає. Чи правильно писати такі тести, або я повинен розбивати числа на константи?
В Чи всі магічні числа створені однаковими? , ми дізналися, що магічні числа в порядку, якщо значення очевидно з контексту, але в цьому випадку числа насправді взагалі не мають значення.
const int TWO = 2;
навіть гірше, ніж просто використовувати 2
. Це відповідає формулюванню правила з наміром порушити його дух.
foo
, це нічого не означало б, і тому параметри. Але насправді, я впевнений , що функція не має це ім'я, і ці параметри не мають назви bar1
, bar2
і bar3
. Зробіть більш реалістичний приклад, коли імена мають значення, тоді має набагато більше сенсу обговорювати, чи потрібні імена даних тестових даних.
1, 2, 3
є індекси 3D-масивів, де ви раніше зберігали значення17
, то я думаю, що цей тест був би дендім (доки ви також маєте негативні тести). Але якщо це результат підрахунку, ви повинні переконатися, що хтось, хто читає цей тест, зрозуміє, чомуfoo(1, 2, 3)
слід17
, і магічні числа, ймовірно, не досягнуть цієї мети.