Existe alguma estrutura de teste de unidade independente de idioma? [fechadas]

11

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:

  1. Escreva testes de unidade independentes de idioma para o código antigo que passa (ou falha se você encontrar erros!).
  2. Execute testes de unidade na sua outra base de código que falharem.
  3. 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.

Bringer128
fonte
Forneça um protocolo de comando de texto puro e use expectpara implementar seus testes.
SK-logic
@ SK-logic de que eu não tinha ouvido falar 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.
Bringer128
por que legado? Você também pode ter um sistema moderno no estilo unix. De qualquer forma, nunca existe uma justificativa válida para não fornecer uma interface de script para nenhuma parte da funcionalidade.
SK-logic
@ SK-logic Desculpe por não ser claro. Eu disse "legado" porque a transferência geralmente é feita de legacy language xpara fancy new language y. Eu não estava tentando sugerir nada sobre o Unix!
Bringer128
@ Bringer123, a propósito, meu pequeno truque para fazer esse tipo de integração do tipo Unix sem nenhum suporte decente ao Unix (por exemplo, sem pipes adequados) é incorporar uma linguagem de script e fornecer acesso ao seu REPL via porta TCP (com REPL em execução em um encadeamento separado). É uma ferramenta poderosa de depuração e um mecanismo de automação de testes. E essa abordagem funciona com literalmente tudo (uma linguagem de script incorporada pode ser muito pequena, pode até ser um quarto em um cenário de recursos limitados).
SK-logic

Respostas:

6

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.

David
fonte
+1 nos testes automatizados de alto nível. Definitivamente valeria a pena o esforço para produzir.
Bringer128
1
"Não acho possível escrever testes de unidade em um idioma diferente". : counter example: no .NET, você pode gravar testes de unidade de C # no Visual Basic (ou em qualquer outro idioma habilitado para .NET). Alguns anos atrás, isso foi até promovido pela Microsoft como uma prática recomendada, pois reduz o risco de se fazer no código e testa o mesmo erro relacionado à linguagem (e especificamente ao relativo mal-entendido do programador). Concordado, não se escreverá testes de unidade no Fortran para testar o código PHP.
Arseni Mourzenko
2

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.

Péter Török
fonte
1
Eu acho que isso mostra o problema com a minha pergunta. Se eles podem interoperar facilmente, por que porta? E se não puderem, a barreira do idioma torna impossível a realização de testes de unidade em vários idiomas.
Bringer128
@ Bringer128, os proponentes da nova geração de linguagens JVM afirmam que problemas específicos podem ser resolvidos mais rapidamente, com um código significativamente menor e mais limpo do que em Java. Minha experiência limitada com Scala confirma isso até agora.
Péter Török
O Groovy também interopera com o Java.
user281377
1

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 ++.

BЈовић
fonte
1

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.

Javier
fonte
0

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

rrsguru
fonte
2
este não parece oferecer nada substancial sobre pontos feitos e explicado em anteriores 4 respostas
mosquito