Pergunta

Entrei para uma equipe que trabalha em um produto.Este produto existe há cerca de 5 anos e usa ASP.NET WebForms.Sua arquitetura original desapareceu com o tempo e as coisas ficaram relativamente desorganizadas em toda a solução.Não é de forma alguma terrível, mas definitivamente precisa de algum trabalho;todos vocês sabem o que quero dizer.

Tenho realizado algumas refatorações desde que entrei na equipe do projeto, há cerca de 6 meses.Algumas dessas refatorações são simples, Extract Method, Pull Method Up, etc.Algumas das refatorações são mais estruturais.As últimas mudanças me deixam nervoso, pois não há um conjunto abrangente de testes unitários para acompanhar cada componente.

Toda a equipe concorda com a necessidade de fazer mudanças estruturais por meio de refatoração, mas nosso gerente de projeto expressou algumas preocupações de que não temos testes adequados para fazer refatorações com a confiança de que não estamos introduzindo bugs de regressão no sistema.Ele gostaria que escrevêssemos mais testes primeiro (na arquitetura existente) e depois realizássemos as refatorações.Meu argumento é que a estrutura de classes do sistema está muito acoplada para escrever testes adequados, e que usar uma abordagem mais orientada a testes enquanto realizamos nossas refatorações pode ser melhor.O que quero dizer com isso não é escrever testes nos componentes existentes, mas escrever testes para requisitos funcionais específicos e, em seguida, refatorar o código existente para atender a esses requisitos.Isso nos permitirá escrever testes que provavelmente terão mais longevidade no sistema, em vez de escrever um monte de testes “descartáveis”.

Alguém tem alguma experiência sobre qual é o melhor curso de ação?Tenho minhas próprias idéias, mas gostaria de ouvir algumas opiniões da comunidade.

Foi útil?

Solução

As preocupações do seu PM são válidas - certifique-se de testar seu sistema antes de fazer qualquer refatoração importante.

Eu recomendo fortemente obter uma cópia do livro de Michael Feather Trabalhando de forma eficaz com código legado (por "Código Legado" Feathers significa qualquer sistema que não seja adequadamente coberto por testes de unidade).Isto está repleto de boas idéias sobre como quebrar esses acoplamentos e dependências de que você fala, de uma maneira segura que não corre o risco de introduzir bugs de regressão.

Boa sorte com o programa de refatoração;na minha experiência, é um processo agradável e catártico com o qual você pode aprender muito.

Outras dicas

Você pode refatorar em paralelo?O que quero dizer é reescrever as partes que você deseja refatorar usando TDD, mas deixar a base de código existente no lugar.Em seguida, eliminar gradualmente o código existente quando seus novos testes atenderem às necessidades do seu PM?

Gostaria também de deixar uma sugestão para visitar o Reestruturação site de Martin Fowler.Ele literalmente escreveu o livro sobre essas coisas.

No que diz respeito à introdução de testes unitários na equação, o melhor método que encontrei é encontrar um componente de nível superior e identificar todas as dependências externas que ele possui em objetos concretos e substituí-las por interfaces.Depois de fazer isso, será muito mais fácil escrever testes de unidade em sua base de código e você poderá fazer isso um componente de cada vez.Melhor ainda, você não terá que jogar fora nenhum teste de unidade.

O teste de unidade ASP.Net pode ser complicado, mas existem muitos frameworks que facilitam sua execução. ASP.Net MVC, e WCSF para nomear alguns.

Apenas lançando uma segunda recomendação para Working Effectively with Legacy Code, um excelente livro que realmente abriu meus olhos para o fato de que quase qualquer código antigo/de baixa qualidade/não testável pode ser discutido!

Concordo totalmente com a resposta de Ian Nelson.Além disso, eu começaria a realizar alguns testes de "alto nível" (testes funcionais ou de componentes) para preservar o comportamento do ponto de vista do usuário.Este ponto pode ser a preocupação mais importante para o seu PM.

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