O que é um teste de unidade , realmente? E existe realmente uma grande dicotomia em jogo aqui?
Trabalhamos em um campo em que ler literalmente um pouco além do final de um buffer pode travar totalmente um programa, ou causar um resultado totalmente impreciso, ou conforme evidenciado pelo recente bug TLS "HeartBleed", coloca um sistema supostamente seguro aberto sem produzir nenhuma evidência direta da falha.
É impossível eliminar toda a complexidade desses sistemas. Mas nosso trabalho é, na medida do possível, minimizar e gerenciar essa complexidade.
Um teste de unidade é um teste que confirma, por exemplo, que uma reserva foi lançada com sucesso em três sistemas diferentes, uma entrada de log é criada e uma confirmação por email é enviada?
Eu vou dizer não . Esse é um teste de integração . E esses definitivamente têm seu lugar, mas também são um tópico diferente.
Um teste de integração funciona para confirmar a função geral de um "recurso" inteiro. Mas o código por trás desse recurso deve ser dividido em blocos de construção simples e testáveis, também conhecidos como "unidades".
Portanto, um teste de unidade deve ter um escopo muito limitado.
O que implica que o código testado pelo teste de unidade deve ter um escopo muito limitado.
O que implica ainda que um dos pilares do bom design é decompor seu problema complexo em partes menores e de propósito único (na medida do possível), que podem ser testadas em relativo isolamento um do outro.
O que você acaba criando é um sistema feito de componentes de base confiáveis e você sabe se alguma dessas unidades fundamentais de código quebra porque você escreveu testes simples, pequenos e de escopo limitado para dizer exatamente isso.
Em muitos casos, você provavelmente também deve ter vários testes por unidade. Os testes em si devem ser simples, testando um e apenas um comportamento na medida do possível.
A noção de um "teste de unidade" testando uma lógica complexa não trivial, elaborada é, penso eu, um pouco de oxímoro.
Portanto, se esse tipo de quebra de projeto deliberada ocorreu, como no mundo um teste de unidade poderia repentinamente começar a produzir falsos positivos, a menos que a função básica da unidade de código testada tenha mudado? E se isso aconteceu, é melhor você acreditar que existem alguns efeitos cascata não óbvios em jogo. Seu teste interrompido, que parece estar produzindo um falso positivo, na verdade está avisando que algumas alterações quebraram um círculo mais amplo de dependências na base de código e precisam ser examinadas e corrigidas.
Algumas dessas unidades (muitas delas) podem precisar ser testadas usando objetos simulados, mas isso não significa que você precise escrever testes mais complexos ou elaborados.
Voltando ao meu exemplo artificial de um sistema de reserva, você realmente não pode ser o envio de solicitações de folga para um banco de dados de reserva ao vivo ou serviço de terceiros (ou mesmo um exemplo "dev" dele) cada vez que você unidade de teste de seu código.
Então você usa zombarias que apresentam o mesmo contrato de interface. Os testes podem validar o comportamento de um pedaço de código determinístico relativamente pequeno. Verde todo o tabuleiro diz que os blocos que compõem sua fundação não estão quebrados.
Mas a lógica dos testes unitários individuais permanece a mais simples possível.