Como você programa efetivamente quando leva muito tempo para simplesmente testar seu código?


16

Meu fluxo de trabalho sempre foi escrever uma etapa lógica e, em seguida, executar o programa e inspecionar a saída. Esse processo me serviu incrivelmente bem para trabalhos na universidade. No entanto, à medida que desenvolvo mais, geralmente há momentos em que simplesmente compilar e executar seu código leva de 1 a 2 minutos. Os exemplos incluem o upload de um programa para um microcontrolador, exigindo interação com um servidor externo e incapaz de implementar a automação devido à autenticação, arquitetura de software ou complexidade.

Esses tipos de tarefas são muito inadequadas para como eu geralmente programa e estou tendo dificuldades em codificar com eficiência. Eu costumo cometer muitos erros de sintaxe e de lógica, a maioria dos quais eu facilmente pego testando. No entanto, com um tempo de espera tão longo, esse método consome muito tempo.


Você está usando um IDE?
Woot4Moo

3
Seu problema raiz não está sendo incapaz de codificar com eficiência, são testes que demoram muito para serem executados. Você está fazendo a pergunta errada.
Rein Henrichs

Use um idioma que tenha um REPL.
Robert Harvey

Você tem colegas que você pode perguntar e aprender?
user985366

Respostas:


25

Primeiro, qualquer tipo de depuração interativa é excelente. Você quer isso no seu kit de ferramentas, porque, se ainda não, um dia você realmente se beneficiará com isso. (Os detalhes variam de acordo com idioma, plataforma e IDE.)

exigindo interação com um servidor externo e incapaz de implementar a automação devido à autenticação, arquitetura de software ou complexidade.

Eu examinaria algumas estruturas para usar objetos simulados . Isso permite que você rodeie o componente que está sendo testado com um falso ecossistema de outros componentes, para que seus testes sejam mais direcionados especificamente e você possa evitar testar tanto tudo como uma unidade inteira.

Além disso, os próprios objetos simulados podem ser programados com asserções, para que você possa verificar se o componente que está sendo testado realmente fez uma determinada chamada.


12

Eu trabalharia duro para reduzir o tempo de teste. Eu havia trabalhado em algumas empresas desenvolvendo código incorporado, e os testes eram dolorosos, exigindo viagens para a sala do servidor e FTPs e reinicializações manuais e vários comandos para o hardware de teste. Então entrei para um grupo muito bom, onde eu poderia simplesmente digitar 'make test' na minha mesa e obter resultados em menos de um minuto. Nesse minuto:

  • Meu código foi incorporado a uma nova imagem do kernel para hardware incorporado.
  • O servidor DHCP foi atualizado para apontar para o novo kernel.
  • A placa de teste foi reiniciada.
  • A placa de teste recuperou o kernel da minha estação de trabalho por meio de uma montagem NFS.
  • A placa de teste foi reiniciada no novo kernel.
  • Os testes de unidade foram executados.
  • A saída do teste de unidade foi entregue de volta à minha estação de trabalho.

Demorou algum tempo para que tudo funcionasse, mas o esforço para automatizar todas essas etapas foi recuperado em cem vezes, à medida que a equipe de desenvolvimento crescia.


2
+1. Não há nenhum problema que não possa ser resolvido com uma quantidade suficiente de script de shell.
Tom Anderson

1
Não vou ficar em equipes que não se importam em melhorar a velocidade.
Kevin cline

@ Tom Exceto muitas camadas de abst - er, shell scripts;)
Darien

Não, você acabou de escrever um script de shell que envolve o outro script de shell. Depois, há apenas esse script de shell. CONFIE EM MIM.
Tom Anderson

3
+1: Melhorar a velocidade da edição -> compilação -> carga -> execução -> depuração -> edição é a melhor coisa que você pode fazer para acelerar a produção do código. Quando trabalhei no Tymshare, tivemos um cara que alegou (corretamente) que seu código foi executado corretamente na primeira tentativa 87% do tempo. Eu, por outro lado, codifiquei como se tivesse uma overdose de macaco cafeína à 1 da manhã (o que eu era). Cometi muitos erros de digitação, etc., mas não me preocupei com eles porque sabia que o compilador os pegaria. No final do dia, eu era provavelmente 3 a 5 vezes mais produtivo do que ele.
precisa

8

Testes automatizados não substituem a revisão e o entendimento.

Pode ser que você esteja usando o teste como muleta. Se você estiver fazendo isso, impedirá seu aprendizado. Não estou defendendo que você não teste. Em vez disso, recomendo que, antes de executar o teste, revise o que você escreveu. Entenda o que você escreveu, verifique se faz sentido e verifique se a sintaxe parece correta.


5

Você já deu a resposta: I usually make a lot of syntax errors and logic errors

Portanto, trabalhando duro para melhorar isso, você poderá reduzir o tempo de teste. Os erros de sintaxe devem ser os primeiros a serem reduzidos. Nunca teve um teste de programação com um papel e um lápis em seu estudo?

Eu tive a mesma coisa quando mudei de PHP para Java. Eu tive que aprender a depurar em vez de apenas imprimir algumas variáveis ​​e pressionar F5 no navegador ...


2
Todos nós cometemos erros estúpidos de tempos em tempos, eles ocorrem menos com o tempo e a experiência.
Maple_shaft

@maple_shaft isso é verdade, mas quando ele diz make a lot ofparece que ele deve investir sua energia para melhorá-lo
WarrenFaith

3
Eu fiz uma boa quantidade de codificação em papel e em quadros brancos. O problema é o mesmo: o código parece certo na primeira inspeção, mas após executá-lo, você percebe seus erros.
Anne Nonimus

notar erros no código e escrever código com sintaxe incorreta é uma grande diferença. O primeiro pode acontecer com todo mundo, o segundo sugere o nível iniciante. Não conheço seu histórico, mas mesmo como iniciante, você deve minimizar os problemas de sintaxe. Qual é o seu IDE e idioma? Deve suportar verificações de sintaxe.
WarrenFaith

@ Anne Nonimus: Você quer dizer erros lógicos? Os erros de sintaxe devem ser detectados pelo seu IDE (idealmente - se você estiver trabalhando com código gerado dinamicamente, esses erros de sintaxe não serão detectados no momento da compilação).
FrustratedWithFormsDesigner

4

Você precisa de uma boa plataforma de teste unitário ou funcional que possa executar testes automaticamente para você, de preferência em segundo plano. Isso exigirá o uso de Mocks, conforme observado acima, e dependendo do idioma em que você estiver usando algum tipo de injeção de dependência.

Tornando seus objetos o mais independentes possível e, em seguida, usando métodos de injeção para adicionar restrições externas, não é difícil criar uma plataforma de teste para o seu código.


2

A verdadeira diversão vem quando você simplesmente não pode testar seu código, exceto usando-o com raiva. Isso acontece muito com os sistemas de negociação, pois os simuladores de troca disponíveis geralmente são ruins, inexistentes ou nem cumprem o que os fornecedores do software de troca dizem que faz. Isso faz parte da rica tapeçaria da vida, receio. Minha abordagem é garantir que pelo menos meu lado da transação seja bem escrito e bem documentado, para que possa ser facilmente alterado rapidamente.


3
Você "troca" e "troca" de engenheiros de software é uma raça única. Meu amigo teve uma série de problemas mentais trabalhando para uma dessas empresas. Nunca ouço coisas boas saírem desse nicho da indústria de software.
Maple_shaft

@ maple Bem, eu não faço mais isso sozinho. Mas único? Nah - qualquer um pode escrever código ruim, e a maioria dos códigos de negociação é profundamente, muito ruim. No entanto, goste ou não, é a base da nossa sociedade.
Neil Butterworth

Sim, ouvi a mesma coisa sobre o código de telecomunicações e quantos milhões de linhas havia no software de controle de switch. Então entrei para uma empresa de telecomunicações e percebi que, se eles tivessem empregado alguns programadores, milhares de linhas seriam suficientes.
Kevin cline

2

Teste de Unidade; Zombe de aplicativos / simuladores.

Isso levará tempo, é garantido, e talvez você precise coletar e massagear dados de amostra para criar modelos apropriados, mas, no final, valerá a pena: você economizará o tempo todo e os problemas que encontrar ao tentar fazer testes externos. sistemas.

Usadas corretamente, essas ferramentas garantirão que, antes de você chegar perto de sistemas externos, você tenha 99,9% de certeza de que, se o seu código falhar, será algo no sistema externo / mudança de ambiente que o causou, não um bug no seu próprio código.

Trabalhei profissionalmente por um bom tempo, como você fazia na escola, e em muitos casos foi muito eficaz. Eventualmente, trabalhei com algumas pessoas que me forçaram a abandonar essa metodologia e usar testes e modelos de unidade.

Agora, não inicio nenhum projeto sem antes pensar na implementação das fases de teste - testes de unidade, modelos, simuladores, dados de amostra etc.


1

Eu costumo cometer muitos erros de sintaxe e de lógica

Talvez o uso de um Linter possa ajudá-lo um pouco aqui.

Eu estava em situação semelhante com meu empregador anterior. Nossa base de código era realmente grande e, para fazer as alterações necessárias, codifique, compile e substitua os .classarquivos em um servidor dev e reinicie o dev-sever com o script de reinicialização. E para minha consternação, levará cerca de meia hora para obter o servidor dev novamente.

Mais tarde, descobri que a depuração remota do servidor dev também era possível.

Então, aqui está o que eu fiz para otimizar meu processo

  • Primeira rodada inicial de depuração remota, isso me permitiu ver o fluxo exato do código e os valores / estados exatos das variáveis.

  • Planejando como e quais mudanças eu farei.

  • Fazendo alterações e comparando as diferenças

  • Armazenando em cache erros usando o linter ou compilando.

  • Fornecendo o hotfix, substituindo os .classarquivos e reiniciando.

Às vezes, eu também incluía muitas instruções de log para verificar novamente o fluxo de código e verificar valores / estados. Isso me ajudou muito.

Também o uso de um IDE com boa complicação automática pode ajudar bastante na redução de erros de digitação.

Espero que isto ajude.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.