J'aimerais pouvoir tester mon code Arduino unitaire. Idéalement, je serais capable d'exécuter des tests sans avoir à télécharger le code sur l'Arduino. Quels outils ou bibliothèques peuvent m'aider à cet égard?
Il existe un émulateur Arduino en développement qui pourrait être utile, mais il ne semble pas encore prêt à être utilisé.
AVR Studio d'Atmel contient un simulateur de puce qui pourrait être utile, mais je ne vois pas comment je l'utiliserais en conjonction avec l'IDE Arduino.
Réponses:
N'exécutez pas de tests unitaires sur le périphérique ou l'émulateur Arduino
Les arguments contre les tests basés sur un périphérique / émulateur / simulateur de microcontrôleur
Le but des tests unitaires est de tester la qualité de votre propre code. Les tests unitaires ne doivent généralement jamais tester la fonctionnalité de facteurs indépendants de votre volonté.
Pensez-y de cette façon: même si vous deviez tester les fonctionnalités de la bibliothèque Arduino, du matériel du microcontrôleur ou d'un émulateur, il est absolument impossible que de tels résultats de test vous disent quoi que ce soit sur la qualité de votre propre travail. Par conséquent, il est beaucoup plus précieux et efficace d'écrire des tests unitaires qui ne s'exécutent pas sur le périphérique cible (ou l'émulateur).
Les tests fréquents sur votre matériel cible ont un cycle extrêmement lent:
L'étape 3 est particulièrement désagréable si vous vous attendez à recevoir des messages de diagnostic via le port série mais que votre projet lui-même doit utiliser le seul port série matériel de votre Arduino. Si vous pensiez que la bibliothèque SoftwareSerial pourrait vous aider, sachez que cela risquerait de perturber toute fonctionnalité nécessitant une synchronisation précise, comme la génération d'autres signaux en même temps. Ce problème m'est arrivé.
Encore une fois, si vous deviez tester votre esquisse à l'aide d'un émulateur et que vos routines critiques en temps fonctionnaient parfaitement jusqu'à ce que vous le téléchargiez sur l'Arduino réel, la seule leçon que vous allez apprendre est que l'émulateur est défectueux - et le sachant toujours. ne révèle rien sur la qualité de votre propre travail.
S'il est ridicule de tester sur l'appareil ou l'émulateur, que dois- je faire?
Vous utilisez probablement un ordinateur pour travailler sur votre projet Arduino. Cet ordinateur est des ordres de grandeur plus rapide que le microcontrôleur. Écrivez les tests à construire et à exécuter sur votre ordinateur .
N'oubliez pas que le comportement de la bibliothèque Arduino et du microcontrôleur doit être considéré comme correct ou du moins systématiquement incorrect .
Lorsque vos tests produisent une sortie contraire à vos attentes, vous avez probablement une faille dans votre code qui a été testé. Si la sortie de votre test correspond à vos attentes, mais que le programme ne se comporte pas correctement lorsque vous le téléchargez sur l'Arduino, vous savez que vos tests étaient basés sur des hypothèses incorrectes et que vous avez probablement un test défectueux. Dans les deux cas, vous aurez reçu de véritables informations sur ce que devraient être vos prochains changements de code. La qualité de vos commentaires est améliorée de " quelque chose est cassé" à "ce code spécifique est cassé" .
Comment créer et exécuter des tests sur votre PC
La première chose à faire est d' identifier vos objectifs de test . Pensez aux parties de votre propre code que vous souhaitez tester, puis assurez-vous de construire votre programme de manière à pouvoir isoler les parties discrètes pour les tests.
Si les pièces que vous souhaitez tester appellent des fonctions Arduino, vous devrez fournir des remplacements de maquette dans votre programme de test. C'est beaucoup moins de travail qu'il n'y paraît. Vos maquettes n'ont rien d'autre à faire que de fournir des entrées et des sorties prévisibles pour vos tests.
Tout code que vous avez l'intention de tester doit exister dans des fichiers source autres que l'esquisse .pde. Ne vous inquiétez pas, votre esquisse sera toujours compilée même avec du code source en dehors de l'esquisse. Lorsque vous y arrivez vraiment, un peu plus que le point d'entrée normal de votre programme devrait être défini dans le fichier d'esquisse.
Il ne reste plus qu'à écrire les tests réels, puis à les compiler à l'aide de votre compilateur C ++ préféré! Ceci est probablement mieux illustré par un exemple du monde réel.
Un exemple de travail réel
L'un de mes projets favoris trouvés ici a quelques tests simples qui s'exécutent sur le PC. Pour cette soumission de réponse, je vais juste passer en revue la façon dont j'ai simulé certaines des fonctions de la bibliothèque Arduino et les tests que j'ai écrits pour tester ces maquettes. Ce n'est pas contraire à ce que j'ai dit précédemment sur le fait de ne pas tester le code des autres parce que c'est moi qui ai écrit les maquettes. Je voulais être très certain que mes maquettes étaient correctes.
Source de mock_arduino.cpp, qui contient du code qui duplique certaines fonctionnalités de support fournies par la bibliothèque Arduino:
J'utilise la maquette suivante pour produire une sortie lisible lorsque mon code écrit des données binaires sur le périphérique série matériel.
fake_serial.h
fake_serial.cpp
et enfin, le programme de test proprement dit:
Cet article est assez long, veuillez donc vous référer à mon projet sur GitHub pour voir d'autres cas de test en action. Je garde mes travaux en cours dans des branches autres que master, donc vérifiez également ces branches pour des tests supplémentaires.
J'ai choisi d'écrire mes propres routines de test légères, mais des frameworks de tests unitaires plus robustes comme CppUnit sont également disponibles.
la source
En l'absence de tout framework de test unitaire préexistant pour Arduino, j'ai créé ArduinoUnit . Voici un simple croquis Arduino démontrant son utilisation:
la source
J'ai un succès considérable dans les tests unitaires de mon code PIC en supprimant l'accès au matériel et en le moquant dans mes tests.
Par exemple, je résume PORTA avec
Ensuite, SetPortA peut facilement être simulé, sans ajouter de code de surcharge dans la version PIC.
Une fois que l'abstraction matérielle a été testée un certain temps, je constate rapidement que le code passe généralement du banc de test au PIC et fonctionne du premier coup.
Mettre à jour:
J'utilise une couture #include pour le code de l'unité, #incluant le code de l'unité dans un fichier C ++ pour le banc de test et un fichier C pour le code cible.
À titre d'exemple, je souhaite multiplexer quatre écrans à 7 segments, un port pilotant les segments et un second sélectionnant l'affichage. Le code d'affichage s'interface avec les affichages via
SetSegmentData(char)
etSetDisplay(char)
. Je peux me moquer de ceux-ci dans mon banc de test C ++ et vérifier que j'obtiens les données attendues. Pour la cible que j'utilise#define
afin d'obtenir une affectation directe sans la surcharge d'un appel de fonctionla source
Il semble que l' émulino ferait parfaitement l'affaire.
Dépôt GitHub
la source
simavr est un simulateur AVR utilisant avr-gcc.
Il prend déjà en charge quelques microcontrôleurs ATTiny et ATMega, et - selon l'auteur - il est facile d'en ajouter d'autres.
Dans les exemples se trouve simduino, un émulateur Arduino. Il prend en charge l'exécution du chargeur de démarrage Arduino et peut être programmé avec avrdude via Socat (un Netcat modifié ).
la source
Vous pouvez effectuer des tests unitaires en Python avec mon projet PySimAVR . Arscons est utilisé pour la construction et simavr pour la simulation.
Exemple:
Démarrer le test:
la source
Je ne connais aucune plate-forme capable de tester le code Arduino.
Cependant, il existe la plate-forme Fritzing , que vous pouvez utiliser pour modéliser le matériel et plus tard pour exporter des diagrammes de circuits imprimés et d'autres choses.
Ça vaut le coup de vérifier.
la source
Nous utilisons des cartes Arduino pour l'acquisition de données dans le cadre d'une grande expérience scientifique. Par la suite, nous devons prendre en charge plusieurs cartes Arduino avec différentes implémentations. J'ai écrit des utilitaires Python pour charger dynamiquement des images hexadécimales Arduino pendant les tests unitaires. Le code trouvé sur le lien ci-dessous prend en charge Windows et Mac OS X via un fichier de configuration. Pour savoir où vos images hexadécimales sont placées par l'IDE Arduino, appuyez sur la touche Maj avant d'appuyer sur le bouton de construction (lecture). Appuyez sur la touche Maj tout en appuyant sur le téléchargement pour savoir où se trouve votre avrdude (utilitaire de téléchargement en ligne de commande) sur votre système / version d'Arduino. Vous pouvez également consulter les fichiers de configuration inclus et utiliser votre emplacement d'installation (actuellement sur Arduino 0020).
http://github.com/toddstavish/Python-Arduino-Unit-Testing
la source
Ce programme permet l'exécution automatisée de plusieurs tests unitaires Arduino. Le processus de test démarre sur le PC mais les tests s'exécutent sur le matériel Arduino réel. Un ensemble de tests unitaires est généralement utilisé pour tester une bibliothèque Arduino. (ce
Forum Arduino: http://arduino.cc/forum/index.php?topic=140027.0
Page du projet GitHub: http://jeroendoggen.github.com/Arduino-TestSuite
Page dans l'index des packages Python: http://pypi.python.org/pypi/arduino_testsuite
Les tests unitaires sont écrits avec la "Arduino Unit Testing Library": http://code.google.com/p/arduinounit
Les étapes suivantes sont effectuées pour chaque ensemble de tests unitaires:
la source
Gardez le code spécifique au matériel séparé ou abstrait du reste afin de pouvoir tester et déboguer ce plus gros «repos» sur n'importe quelle plate-forme pour laquelle vous avez de bons outils et avec laquelle vous êtes le plus familier.
En gros, essayez de créer autant de code final à partir d'autant de blocs de construction connus que possible. Le travail restant spécifique au matériel sera alors beaucoup plus facile et plus rapide. Vous pouvez le terminer en utilisant vous-même des émulateurs et / ou des dispositifs d'émulation existants. Et puis, bien sûr, vous devrez tester la réalité d'une manière ou d'une autre. Selon les circonstances, cela peut être très bien automatisé ou non (c'est-à-dire qui ou quoi appuiera sur les boutons et fournira d'autres entrées? Qui ou quoi observera et interprétera divers indicateurs et résultats?).
la source
James W. Grenning écrit de grands livres et celui - ci est sur les tests unitaires du code embarqué C Test Driven Development pour Embedded C .
la source
J'utilise Searduino lors de l'écriture de code Arduino. Searduino est un simulateur Arduino et un environnement de développement (Makefiles, code C ...) qui facilite le piratage en C / C ++ à l'aide de votre éditeur préféré. Vous pouvez importer des croquis Arduino et les exécuter dans le simulateur.
Capture d'écran de Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png
Searduino 0.9 sortira et une vidéo sera enregistrée dès que les derniers tests seront effectués .... dans un jour ou deux.
Tester sur le simulateur ne doit pas être considéré comme de vrais tests, mais cela m'a certainement beaucoup aidé à trouver des erreurs stupides / logiques (oublier de faire
pinMode(xx, OUTPUT)
, etc.).BTW: Je suis l'une des personnes qui développent Searduino.
la source
J'ai construit
arduino_ci
dans ce but. Bien qu'il se limite à tester des bibliothèques Arduino (et non des croquis autonomes), il permet d'exécuter des tests unitaires soit localement, soit sur un système CI (comme Travis CI ou Appveyor).Considérez une bibliothèque très simple dans votre répertoire de bibliothèque Arduino, appelée
DoSomething
, avecdo-something.cpp
:Vous le testeriez unitaire comme suit (avec un fichier de test appelé
test/is_four.cpp
ou un autre):C'est tout. Si cette
assertEqual
syntaxe et cette structure de test vous semblent familières, c'est parce que j'ai adopté une partie de la bibliothèque ArduinoUnit de Matthew Murdoch qu'il a mentionnée dans sa réponse .Voir Reference.md pour plus d'informations sur les tests unitaires des broches d'E / S, de l'horloge, des ports série, etc.
Ces tests unitaires sont compilés et exécutés à l'aide d'un script contenu dans une gemme ruby. Pour obtenir des exemples de configuration, consultez le fichier README.md ou copiez simplement l'un de ces exemples:
la source
Il existe un projet appelé ncore , qui fournit un noyau natif pour Arduino. Et vous permet d'écrire des tests pour le code Arduino.
À partir de la description du projet
Également dans la section "De quoi ai-je besoin pour l'utiliser"
la source
Si vous souhaitez tester un code en dehors de MCU (sur le bureau), consultez libcheck: https://libcheck.github.io/check/
Je l'ai utilisé pour tester mon propre code embarqué à quelques reprises. C'est un cadre assez robuste.
la source
Vous pouvez utiliser emulare - vous pouvez faire glisser et déposer un microcontrôleur sur un diagramme et exécuter votre code dans Eclipse. La documentation sur le site Web vous explique comment le configurer.
la source
Utilisez Proteus VSM avec une bibliothèque Arduino pour déboguer votre code ou pour le tester.
C'est une bonne pratique avant d'intégrer votre code, mais assurez-vous de respecter les délais, car la simulation ne s'exécute pas en temps réel lorsqu'elle s'exécute sur la carte.
la source
Essayez le simulateur de circuit Autodesk . Il permet de tester le code et les circuits Arduino avec de nombreux autres composants matériels.
la source
Dans Arduino de base est écrit avec C et C ++, même les bibliothèques d'arduino sont écrites en C et C ++. Donc, en termes simples, gérez simplement le code en C et C ++ et essayez de faire les tests unitaires. Ici, par le mot «handle», je veux dire que vous devez changer toute la syntaxe de base comme serial.println en sysout, pinmode en varaibles, boucle vide en boucle while () qui se brise soit dans keystock ou après une certaine itération.
Je sais que ce processus est un peu long et pas si simple.Selon mon expérience personnelle, une fois que vous avez compris, cela s'avère plus fiable.
-Nandha_Frost
la source
Si vous souhaitez exécuter un croquis INO et vérifier la sortie série, j'en ai une implémentation fonctionnelle dans mon projet de somme de contrôle Arduino NMEA .
Le script suivant prend le fichier et utilise Arduino CLI pour le compiler dans un fichier HEX qui est ensuite chargé dans SimAVR qui l'évalue et imprime la sortie série. Étant donné que tous les programmes Arduino fonctionnent pour toujours sans vraiment avoir la possibilité de se tuer (
exit(0)
ne fonctionne pas), je laisse le croquis s'exécuter pendant quelques secondes, puis je diffère la sortie capturée avec la sortie attendue.Téléchargez et extrayez la CLI Arduino (dans ce cas, la version 0.5.0 - la dernière au moment de la rédaction):
Vous pouvez maintenant mettre à jour l'index et installer le noyau approprié:
En supposant que votre esquisse est nommée
nmea-checksum.ino
, pour obtenir ELF et HEX, exécutez:Ensuite, SimAVR pour exécuter HEX (ou ELF) - Je construis à partir des sources car la dernière version ne fonctionnait pas pour moi:
Une compilation réussie vous donnera ce
simavr/run_avr
que vous pouvez utiliser pour exécuter l'esquisse. Comme je l'ai dit,timeout
sinon cela ne se terminera jamais:Le fichier généré aura des caractères de contrôle de code couleur ANSI enveloppant la sortie série, pour se débarrasser de ceux-ci:
Il ne vous reste plus qu'à comparer ce fichier à un bon fichier connu:
S'il n'y a pas de différences, se
diff
terminera avec le code 0, sinon le script échouera.la source