Я считаю, что это заблуждение, как я могу думать.
Тестовый код, который тестирует производственный код, совсем не похож. Я продемонстрирую в Python:
def multiply(a, b):
"""Multiply ``a`` by ``b``"""
return a*b
Тогда простой тест будет:
def test_multiply():
assert multiply(4, 5) == 20
Обе функции имеют одинаковое определение, но обе делают разные вещи. Здесь нет повторяющегося кода. ;-)
Также бывает, что люди пишут повторяющиеся тесты, по существу, имеющие одно утверждение для каждой тестовой функции. Это безумие, и я видел, как люди это делают. Это является плохой практикой.
def test_multiply_1_and_3():
"""Assert that a multiplication of 1 and 3 is 3."""
assert multiply(1, 3) == 3
def test_multiply_1_and_7():
"""Assert that a multiplication of 1 and 7 is 7."""
assert multiply(1, 7) == 7
def test_multiply_3_and_4():
"""Assert that a multiplication of 3 and 4 is 12."""
assert multiply(3, 4) == 12
Представьте, что вы делаете это для 1000+ эффективных строк кода. Вместо этого вы тестируете для каждой функции:
def test_multiply_positive():
"""Assert that positive numbers can be multiplied."""
assert multiply(1, 3) == 3
assert multiply(1, 7) == 7
assert multiply(3, 4) == 12
def test_multiply_negative():
"""Assert that negative numbers can be multiplied."""
assert multiply(1, -3) == -3
assert multiply(-1, -7) == 7
assert multiply(-3, 4) == -12
Теперь, когда функции добавляются / удаляются, мне нужно только рассмотреть возможность добавления / удаления одной тестовой функции.
Возможно, вы заметили, я не применял for
петли. Это потому, что повторять некоторые вещи хорошо. Когда я применил бы циклы, код был бы намного короче. Но когда утверждение не выполняется, оно может запутать вывод, отображающий неоднозначное сообщение. Если это происходит , то ваши тесты будут менее полезны , и вы будете нуждаться в отладчике , чтобы проверить , где дела идут плохо.