O principal problema com o código legado é que ele não tem testes. Então você precisa adicionar alguns (e depois mais ...).
Isso em si exigiria muito trabalho, como @mattnz observou. Mas o problema especial do código legado é que ele nunca foi projetado para ser testável . Então, normalmente é uma confusão enorme de código espaguete, onde é muito difícil ou absolutamente impossível isolar peças pequenas para serem testadas na unidade. Então, antes do teste de unidade, você precisa refatorar o código para torná-lo mais testável.
No entanto, a fim de refatorar com segurança, você deve ter testes de unidade para verificar se você não quebrou nada com suas alterações ... Essa é a captura 22 do código legado.
O livro ensina como sair desse problema, fazendo as alterações mínimas, mais seguras, absolutas no código apenas para habilitar os primeiros testes unitários. Estes não são feitos para tornar o design mais agradável - apenas para permitir testes unitários. Na verdade, às vezes eles tornam o design mais feio ou mais complexo. No entanto, eles permitem que você escreva testes - e depois de ter testes de unidade no lugar, você está livre para fazer o design melhor.
Existem muitos truques para tornar o código testável - alguns são óbvios, outros não são de todo. Existem métodos que eu nunca teria pensado sobre mim mesmo, sem ler o livro. Mas o que é ainda mais importante é que o Feathers explica o que torna precisamente uma unidade de código testável. Você precisa cortar dependências e introduzir barreiras em seu código, mas por duas razões distintas:
- sentindo - para verificar e verificar os efeitos da execução de um trecho de código e
- separation - para obter a parte específica do código em um arnês de teste antes de tudo.
Cortar dependências com segurança pode ser complicado. Introduzir interfaces, mocks e Injeção de Dependência é um objetivo limpo e agradável, mas não necessariamente seguro para fazer neste momento. Então, às vezes temos que recorrer à subclassificação da classe sob teste, a fim de substituir algum método que normalmente, por exemplo, iniciar um pedido direto para um banco de dados. Outras vezes, podemos até precisar substituir uma classe de dependência / jar por uma falsa no ambiente de teste ...
Para mim, o conceito mais importante trazido por Feathers é costuras . Uma costura é um lugar no código onde você pode alterar o comportamento do seu programa sem modificar o próprio código . Criar emendas em seu código permite separar o pedaço de código em teste, mas também permite que você detecte o comportamento do código em teste mesmo quando é difícil ou impossível fazer diretamente (por exemplo, porque a chamada faz alterações em outro objeto ou subsistema, cujo estado não é possível consultar diretamente a partir do método de teste).
Esse conhecimento permite que você perceba as sementes da testabilidade na pilha de código mais desagradável e encontre as alterações mínimas, menos prejudiciais e mais seguras para chegar lá. Em outras palavras, para evitar refatorações "óbvias" que correm o risco de quebrar o código sem que você perceba - porque você ainda não <<> tem os testes unitários para detectar isso.