Pergunta

Sempre ouço pessoas dizerem que os testes devem ser simples, fáceis de manter e diretos, mas o que acontece com a reutilização de código em testes unitários?

Vejamos por exemplo:

def test_some_1():
    ...some code

def test_some_2():
    ...code repeated from test_some_1

Não seria melhor encapsular o código repetido dos dois testes em uma função que contivesse as asserções necessárias?

Eu argumentei com alguns programadores sobre isso e eles discordaram, disseram que os testes deveriam ser burros, que a reutilização do código não é boa aqui.A razão para isso é porque não está muito claro no console do Django onde a asserção realmente falhou, porque a asserção estava na função, embora eu discorde porque usá-la com o nariz lhe daria o nome do teste e o traceback, embora os caras discordaram novamente, afirmando que um teste poderia ser invocado individualmente sem nariz (e portanto não dava para ver todos esses detalhes).

O que é que vocês acham?

  • É bom usar a reutilização de código em testes unitários?
  • Se a reutilização pode/deve ser usada, então como superar o outro problema relacionado à identificação das afirmações?
Foi útil?

Solução

Os fatores mais importantes para a qualidade do código, como clareza e legibilidade, também são importantes para o código de teste.Se a repetição do código facilitar a leitura, você deverá fazer isso independentemente de estar escrevendo um código de teste e vice-versa.

Por exemplo, em um pacote que escrevi, tinha uma função:

def _test_vector(self, a, b, c):
    # test the function with parameter values a, b, c
    # several asserts here to verify output of function tested

Isso permitiu escrever todos os vetores de teste como:

def test_vector1(self):
    self._test_vector(a=42, b=5, c="blah)

Isso, IMO, melhora a clareza, porque os testes individuais incluem apenas as informações específicas desse teste.

Identificar afirmações deve sempre ser fácil.Até unittest fornecerá um rastreamento e, se sua configuração de teste não apontar para uma afirmação específica, você terá dificuldade em depurar quaisquer falhas de teste e definitivamente deverá mudar para algo sensato.

Outras dicas

Como seus colegas disseram, você deveria escrever seus testes de maneira idiota.Existem vários motivos para isso, o mais importante é que você deseja evitar lógica complexa nos testes.Se você escrever seus testes "inteligentes", eles tenderão a conter a mesma lógica ou uma lógica semelhante ao código que você está tentando testar.Isso significa que você corre o risco de cometer o mesmo erro em ambos os lugares e perderá os bugs que deseja encontrar.

Outro motivo é que você deseja que seu teste atue como documentação do código que você está tentando testar.Se o teste tiver um caminho de execução complexo através de muitas funções e lógica, não será tão fácil de entender.No melhor dos mundos, você veria como o código de produção deve funcionar apenas dando uma olhada no teste.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top