Eu sempre fui cético em reescrever códigos de trabalho - portar códigos não é uma exceção a isso. No entanto, com o advento do TDD e dos testes automatizados, é muito mais razoável reescrever e refatorar o código.
Alguém sabe se existe uma ferramenta TDD que pode ser usada para portar código antigo? Idealmente, você pode fazer o seguinte:
- Escreva testes de unidade independentes de idioma para o código antigo que passa (ou falha se você encontrar erros!).
- Execute testes de unidade na sua outra base de código que falharem.
- Escreva um código no seu novo idioma que passe nos testes sem examinar o código antigo.
A alternativa seria dividir a etapa 1 em "Escrever testes de unidade no idioma 1" e "Testes de unidade de porta no idioma 2", o que aumenta significativamente o esforço necessário e é difícil de justificar se a antiga base de códigos deixará de ser mantida após a porta (ou seja, você não obtém o benefício da integração contínua nessa base de código).
EDIT: Vale a pena notar esta pergunta no StackOverflow.
unit-testing
language-agnostic
porting
Bringer128
fonte
fonte
expect
para implementar seus testes.expect
. Se você possui um sistema legado no estilo Unix que se comunica com pipes usando stdin e stdout, essa ferramenta pode ser usada com certeza. De fato, seria muito fácil testar também com qualquer linguagem de script.legacy language x
parafancy new language y
. Eu não estava tentando sugerir nada sobre o Unix!Respostas:
Eu não acho que é possível escrever testes de unidade em um idioma diferente.
No entanto, o que você pode fazer é escrever testes de integração / aceitação / interface com o usuário / whaterver_you_name_it com um nível muito alto e que não estejam vinculados ao idioma com o qual o software foi gravado.
Se o seu aplicativo for um serviço da web, você poderá testá-lo com o idioma que desejar, desde que ele suporte seu protocolo. Se o seu aplicativo for executado em um navegador, você poderá usar o selênio (esse foi o primeiro que me ocorreu, mas existem outros. Etc. Pode haver alguns casos em que não funcionaria, imagino (talvez coisas de hardware), tudo depende no tipo de aplicativo em que você está trabalhando.
Obviamente, você não terá a mesma cobertura que teria com os testes de nível de unidade (a menos que gaste muito tempo), mas pelo menos, teria um equipamento de teste.
fonte
Acho que o que mais se aproxima da sua ideia são estruturas de teste de unidade em ecossistemas baseados em máquinas virtuais, como a Java VM. Pelo menos Scala (e também acredito no Groovy - não tenho muita certeza do Clojure) é quase perfeitamente interoperável com o Java. Ou seja, o código Scala pode ser testado com JUnit e o código Java pode ser testado com ScalaTest. Dessa forma, você pode (gradualmente ou de uma vez) reescrever o código Java no Scala e continuar usando os mesmos testes de unidade Java antigos para verificar sua correção. (Ou o contrário - embora eu não possa imaginar um motivo válido para migrar do Scala de volta para Java.)
Provavelmente o mesmo se aplica às linguagens na CLI do .NET, por exemplo, C #, F #, ASP.NET et al.
Fora de uma VM / CLR, no entanto, é mais difícil. Em teoria, é possível compilar testes de unidade e / ou código em teste em outro idioma, como C (como era e é comum em novos idiomas, como C ++, etc.), mas nunca ouvi falar de alguém fazendo isso especificamente com testes de unidade.
fonte
Essa estrutura não existe, porque precisa ser escrita no idioma do código usado.
Por exemplo, uma estrutura para testar o código c ++ precisa ser escrita em c ou c ++. O uso da estrutura escrita em c ++ pode, mas não testará o código CA se ele usar os recursos do c ++.
fonte
As metodologias variam, mas no meu caso, grande parte dos meus testes TDD tendem ao estilo 'teste de integração', em oposição ao 'teste de unidade'. Ou seja, muitos deles testam o programa inteiro em consultas quase reais, verificando as respostas apropriadas.
Em alguns casos, quando escrevi programas direcionados à rede (principalmente protocolos específicos de aplicativos), não tinha uma estrutura de teste completa à mão que parecesse fácil para o trabalho, então fiz a maioria dos testes 'em toda a rede', em Em resumo, escrevi um cliente muito simples em outro idioma com uma estrutura de teste comum e simples, e a maioria dos testes verificou as respostas do servidor.
Mesmo assim, mesmo nesses casos, injetei alguns testes feitos à mão no aplicativo real para testar algumas partes que não são da rede.
fonte
A estrutura de teste independente de idioma é uma estrutura de teste genérica adequada para o teste de aceitação (ponto de vista) e os casos de teste nessa estrutura são gerenciados pelo controle de qualidade, por exemplo, Robotframework
fonte