В моих модульных тестах я часто выбрасываю произвольные значения в свой код, чтобы посмотреть, что он делает. Например, если я знаю, что 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
это индексы трехмерного массива, в которых вы ранее сохранили значение17
, то я думаю, что этот тест будет отличным (если у вас есть и отрицательные тесты). Но если это результат вычислений, вы должны убедиться, что любой, кто читает этот тест, поймет, почему такfoo(1, 2, 3)
должно быть17
, и магические числа, вероятно, не достигнут этой цели.