Eu acredito que isso é um equívoco de qualquer maneira que eu possa pensar.
O código de teste que testa o código de produção não é nada parecido. Vou demonstrar em python:
def multiply(a, b):
"""Multiply ``a`` by ``b``"""
return a*b
Então, um teste simples seria:
def test_multiply():
assert multiply(4, 5) == 20
Ambas as funções têm uma definição semelhante, mas ambas fazem coisas muito diferentes. Nenhum código duplicado aqui. ;-)
Também ocorre que as pessoas escrevem testes duplicados tendo essencialmente uma asserção por função de teste. Isso é loucura e já vi pessoas fazendo isso. Isso é uma má prática.
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
Imagine fazer isso para mais de 1000 linhas de código eficazes. Em vez disso, você testa por 'recurso':
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
Agora, quando os recursos são adicionados / removidos, só tenho que considerar adicionar / remover uma função de teste.
Você deve ter notado que eu não apliquei for
loops. Isso ocorre porque repetir algumas coisas é bom. Quando eu aplicaria loops, o código seria muito menor. Mas quando uma afirmação falha, pode ofuscar a saída que exibe uma mensagem ambígua. Se isso ocorrer, em seguida, os testes serão menos útil e você vai precisar de um depurador para inspecionar onde as coisas dão errado.