Eu gostaria de poder testar meu código do Arduino. Idealmente, eu seria capaz de executar qualquer teste sem precisar fazer o upload do código no Arduino. Quais ferramentas ou bibliotecas podem me ajudar com isso?
Existe um emulador do Arduino em desenvolvimento que pode ser útil, mas ainda não parece estar pronto para uso.
O AVR Studio da Atmel contém um simulador de chip que pode ser útil, mas não vejo como o utilizaria em conjunto com o Arduino IDE.
Respostas:
Não execute testes de unidade no dispositivo ou emulador do Arduino
O caso contra o microcontrolador Device / Emulator / Sim-based test
O objetivo do teste de unidade é testar a qualidade do seu próprio código. Os testes de unidade geralmente nunca devem testar a funcionalidade de fatores fora do seu controle.
Pense da seguinte maneira: mesmo se você testasse a funcionalidade da biblioteca do Arduino, do hardware do microcontrolador ou de um emulador, é absolutamente impossível que esses resultados de teste lhe digam algo sobre a qualidade do seu próprio trabalho. Portanto, é muito mais valioso e eficiente escrever testes de unidade que não são executados no dispositivo de destino (ou emulador).
Os testes frequentes no hardware de destino têm um ciclo dolorosamente lento:
A Etapa 3 é particularmente desagradável se você espera receber mensagens de diagnóstico via porta serial, mas seu projeto precisa usar a única porta serial de hardware do Arduino. Se você estava pensando que a biblioteca SoftwareSerial pode ajudar, você deve saber que isso pode atrapalhar qualquer funcionalidade que exija tempo preciso, como gerar outros sinais ao mesmo tempo. Este problema aconteceu comigo.
Novamente, se você testasse seu esboço usando um emulador e suas rotinas com tempo crítico funcionassem perfeitamente até você fazer o upload para o Arduino real, a única lição que você aprenderá é que o emulador é defeituoso - e sabendo disso ainda não revela nada sobre a qualidade do seu próprio trabalho.
Se for tolo testar no dispositivo ou emulador, o que devo fazer?
Você provavelmente está usando um computador para trabalhar no seu projeto do Arduino. Esse computador é uma ordem de grandeza mais rápida que o microcontrolador. Escreva os testes para criar e executar no seu computador .
Lembre-se de que o comportamento da biblioteca e do microcontrolador do Arduino deve ser considerado correto ou pelo menos consistentemente incorreto .
Quando seus testes produzem resultados contrários às suas expectativas, você provavelmente tem uma falha no seu código que foi testada. Se a saída do seu teste corresponder às suas expectativas, mas o programa não se comportar corretamente quando você o enviar para o Arduino, você saberá que seus testes foram baseados em suposições incorretas e é provável que você tenha um teste defeituoso. Em ambos os casos, você terá informações reais sobre quais devem ser suas próximas alterações de código. A qualidade dos seus comentários foi aprimorada de " algo está quebrado" para "esse código específico está quebrado" .
Como criar e executar testes no seu PC
A primeira coisa que você precisa fazer é identificar suas metas de teste . Pense em quais partes do seu próprio código você deseja testar e, em seguida, certifique-se de construir seu programa de forma que você possa isolar partes discretas para teste.
Se as peças que você deseja testar chamarem alguma função do Arduino, será necessário fornecer substituições de maquete em seu programa de teste. Isso é muito menos trabalho do que parece. Suas maquetes não precisam fazer nada além de fornecer entradas e saídas previsíveis para seus testes.
Qualquer código seu que você pretenda testar precisa existir em arquivos de origem que não sejam o esboço .pde. Não se preocupe, seu esboço ainda será compilado, mesmo com algum código-fonte fora dele. Quando você realmente faz isso, pouco mais do que o ponto de entrada normal do seu programa deve ser definido no arquivo de esboço.
Tudo o que resta é escrever os testes reais e compilá-lo usando o seu compilador C ++ favorito! Provavelmente, isso é melhor ilustrado com um exemplo do mundo real.
Um exemplo de trabalho real
Um dos meus projetos de estimação encontrados aqui tem alguns testes simples que são executados no PC. Para enviar esta resposta, mostrarei como simulei algumas das funções da biblioteca do Arduino e os testes que escrevi para testar essas maquetes. Isso não é contrário ao que eu disse antes sobre não testar o código de outras pessoas, porque fui eu quem escreveu os modelos. Eu queria ter certeza de que minhas maquetes estavam corretas.
Origem do mock_arduino.cpp, que contém código que duplica algumas funcionalidades de suporte fornecidas pela biblioteca do Arduino:
Uso o seguinte modelo para produzir uma saída legível quando meu código grava dados binários no dispositivo serial de hardware.
fake_serial.h
fake_serial.cpp
e, finalmente, o programa de teste real:
Como este post é longo o suficiente, consulte o meu projeto no GitHub para ver mais casos de teste em ação. Eu mantenho meus trabalhos em andamento em ramos que não sejam mestre, portanto verifique esses ramos para testes extras também.
Eu escolhi escrever minhas próprias rotinas de teste leves, mas estruturas de teste de unidade mais robustas como o CppUnit também estão disponíveis.
fonte
Na ausência de estruturas de teste de unidade pré-existentes para o Arduino, criei o ArduinoUnit . Aqui está um esboço simples do Arduino demonstrando seu uso:
fonte
Tenho um sucesso considerável ao testar meu código PIC, abstraindo o acesso ao hardware e zombando dele em meus testes.
Por exemplo, eu abstraio PORTA com
Em seguida, o SetPortA pode ser facilmente zombado, sem adicionar código adicional na versão PIC.
Depois que a abstração de hardware é testada há algum tempo, logo percebo que geralmente o código vai do equipamento de teste ao PIC e funciona pela primeira vez.
Atualizar:
Uso uma costura #include para o código da unidade, #incluindo o código da unidade em um arquivo C ++ para a plataforma de teste e um arquivo C para o código de destino.
Como exemplo, quero multiplexar quatro displays de 7 segmentos, uma porta direcionando os segmentos e uma segunda selecionando o display. O código do display faz interface com os displays via
SetSegmentData(char)
eSetDisplay(char)
. Eu posso zombar deles no meu equipamento de teste C ++ e verificar se recebo os dados que espero. Para o destino que uso#define
para obter uma atribuição direta sem a sobrecarga de uma chamada de funçãofonte
Parece que emulino faria o trabalho perfeitamente.
Repositório do GitHub
fonte
O simavr é um simulador de AVR usando o avr-gcc.
Ele já suporta alguns microcontroladores ATTiny e ATMega e, segundo o autor, é fácil adicionar um pouco mais.
Nos exemplos está o simduino, um emulador do Arduino. Ele suporta a execução do gerenciador de inicialização Arduino e pode ser programado com avrdude através do Socat (um Netcat modificado ).
fonte
Você pode testar a unidade em Python com meu projeto, PySimAVR . Arscons é usado para construção e simavr para simulação.
Exemplo:
Iniciar teste:
fonte
Não conheço nenhuma plataforma que possa testar o código do Arduino.
No entanto, existe a plataforma Fritzing , que você pode usar para modelar o hardware e, posteriormente, exportar diagramas de PCB e outras coisas.
Vale a pena conferir.
fonte
Estamos usando placas Arduino para aquisição de dados em um grande experimento científico. Posteriormente, temos que suportar várias placas Arduino com diferentes implementações. Eu escrevi utilitários Python para carregar dinamicamente imagens hexadecimais do Arduino durante o teste de unidade. O código encontrado no link abaixo suporta Windows e Mac OS X através de um arquivo de configuração. Para descobrir onde suas imagens hexadecimais são colocadas pelo Arduino IDE, pressione a tecla Shift antes de pressionar o botão de compilação (reprodução). Pressione a tecla Shift enquanto pressiona o upload para descobrir onde o seu avrdude (utilitário de upload da linha de comando) está localizado no seu sistema / versão do Arduino. Como alternativa, você pode ver os arquivos de configuração incluídos e usar o local de instalação (atualmente no Arduino 0020).
http://github.com/toddstavish/Python-Arduino-Unit-Testing
fonte
Este programa permite a execução automatizada de vários testes de unidade do Arduino. O processo de teste é iniciado no PC, mas os testes são executados no hardware real do Arduino. Um conjunto de testes de unidade é normalmente usado para testar uma biblioteca do Arduino. (isto
Fórum do Arduino: http://arduino.cc/forum/index.php?topic=140027.0
Página de projeto do GitHub: http://jeroendoggen.github.com/Arduino-TestSuite
Página no índice do pacote Python: http://pypi.python.org/pypi/arduino_testsuite
Os testes de unidade são gravados com a "Biblioteca de testes de unidade do Arduino": http://code.google.com/p/arduinounit
As etapas a seguir são executadas para cada conjunto de testes de unidade:
fonte
Mantenha o código específico do hardware separado ou abstrato do resto para poder testar e depurar esse "resto" maior em qualquer plataforma para a qual você tenha boas ferramentas e com a qual você esteja mais familiarizado.
Basicamente, tente criar o máximo do código final a partir do maior número possível de blocos de construção conhecidos. O restante trabalho específico do hardware será muito mais fácil e rápido. Você pode finalizá-lo usando emuladores existentes e / ou dispositivos de emulação por conta própria. E então, é claro, você precisará testar a coisa real de alguma forma. Dependendo das circunstâncias, isso pode ou não ser muito bem automatizável (ou seja, quem ou o que pressionará os botões e fornecerá outras entradas? Quem ou o que observará e interpretará vários indicadores e saídas?).
fonte
James W. Grenning escreve grandes livros e este é sobre a unidade de teste de código C incorporado Test Driven Development para incorporado C .
fonte
Estou usando o Searduino ao escrever o código do Arduino. O Searduino é um simulador do Arduino e um ambiente de desenvolvimento (Makefiles, código C ...) que facilita o hack no C / C ++ usando o seu editor favorito. Você pode importar esboços do Arduino e executá-los no simulador.
Captura de tela do Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png
O Searduino 0.9 será lançado e um vídeo será gravado assim que os últimos testes forem concluídos ... em um dia ou dois.
Testar no simulador não deve ser considerado como testes reais, mas certamente me ajudou muito a encontrar erros estúpidos / lógicos (esquecendo de fazer
pinMode(xx, OUTPUT)
, etc.).BTW: Eu sou uma das pessoas que desenvolvem o Searduino.
fonte
Eu construí
arduino_ci
para esse fim. Embora seja limitado ao teste de bibliotecas do Arduino (e não de esboços independentes), ele permite que os testes de unidade sejam executados localmente ou em um sistema de CI (como Travis CI ou Appveyor).Considere uma biblioteca muito simples no diretório Arduino Library, chamada
DoSomething
, comdo-something.cpp
:Você testaria a unidade da seguinte maneira (com um arquivo de teste chamado
test/is_four.cpp
ou algo parecido):Isso é tudo. Se essa
assertEqual
estrutura de sintaxe e teste parece familiar, é porque eu adotei parte da biblioteca ArduinoUnit de Matthew Murdoch a que ele se referiu em sua resposta .Consulte o Reference.md para obter mais informações sobre os testes de unidade dos pinos de E / S, o relógio, as portas seriais etc.
Esses testes de unidade são compilados e executados usando um script contido em uma gema de rubi. Para exemplos de como configurar isso, consulte o arquivo README.md ou copie de um destes exemplos:
fonte
Existe um projeto chamado ncore , que fornece núcleo nativo para o Arduino. E permite que você escreva testes para o código do Arduino.
A partir da descrição do projeto
Também na seção "o que eu preciso para usá-lo"
fonte
Se você quiser testar o código de unidade fora do MCU (na área de trabalho), consulte libcheck: https://libcheck.github.io/check/
Usei-o para testar meu próprio código incorporado algumas vezes. É uma estrutura bastante robusta.
fonte
Você pode usar o emular - você pode arrastar e soltar um microcontrolador em um diagrama e executar seu código no Eclipse. A documentação no site informa como configurá-lo.
fonte
Use o Proteus VSM com uma biblioteca do Arduino para depurar seu código ou testá-lo.
É uma prática recomendada antes de integrar seu código, mas certifique-se dos intervalos, pois a simulação não é executada em tempo real, como é feita no quadro.
fonte
Experimente o simulador de circuitos da Autodesk . Permite testar o código e os circuitos do Arduino com muitos outros componentes de hardware.
fonte
No básico, o Arduino é escrito com C e C ++, até as bibliotecas do arduino são escritas em C e C ++. Portanto, em termos simples, manipule o código como C e C ++ e tente fazer o teste de unidade. Aqui, com a palavra "handle", quero dizer que você altere toda a sintaxe básica como serial.println para sysout, pinmode para varaibles, void loop para while () loop que quebra no keytock ou após alguma iteração.
Sei que este é um processo um pouco longo e não é tão direto. Na minha experiência pessoal, quando você o faz, isso se torna mais confiável.
-Nandha_Frost
fonte
Caso você esteja interessado em executar um esboço INO e fazer check-out da saída serial, eu tenho uma implementação funcional disso no meu projeto de soma de verificação Arduino NMEA .
O script a seguir pega o arquivo e usa a CLI do Arduino para compilá-lo em um arquivo HEX que é carregado no SimAVR que o avalia e imprime a saída serial. Como todos os programas do Arduino são executados para sempre sem realmente ter a opção de se matar (
exit(0)
não funciona), deixo o rascunho por alguns segundos e depois difiro a saída capturada com a saída esperada.Faça o download e extraia a CLI do Arduino (neste caso, versão 0.5.0 - mais recente no momento da redação):
Agora você pode atualizar o índice e instalar o núcleo apropriado:
Supondo que seu esboço seja nomeado
nmea-checksum.ino
, para obter ELF e HEX, execute:Em seguida, o SimAVR para executar o HEX (ou ELF) - eu construo a partir do código-fonte porque a versão mais recente não funcionou para mim:
A compilação bem-sucedida fornecerá o
simavr/run_avr
que você pode usar para executar o esboço. Como eu disse,timeout
caso contrário, nunca terminará:O arquivo gerado terá caracteres de controle de código de cores ANSI envolvendo a saída serial, para se livrar deles:
Agora, tudo o que você precisa fazer é comparar esse arquivo com um arquivo conhecido:
Se não houver diferenças,
diff
sairá com o código 0, caso contrário, o script falhará.fonte