151 votes

Comment puis-je tester le code Arduino?

Je voudrais être en mesure de l'unité de tester mon code Arduino. Idéalement, je voudrais être en mesure d'exécuter tous les tests sans avoir à télécharger le code de l'Arduino. Quels sont les outils ou les bibliothèques peuvent m'aider?

Il y a un Arduino émulateur en développement qui pourrait être utile, mais il ne semble pas encore être prêt pour l'utilisation.

AVR Studio d'Atmel contient une puce simulateur qui pourrait être utile, mais je ne vois pas comment je pourrais l'utiliser en conjonction avec l'IDE Arduino.

106voto

Iron Savior Points 1100

Ne pas Exécuter des Tests Unitaires sur l'Arduino Appareil ou l'Émulateur

Le cas contre le microcontrôleur de l'Appareil/Emulateur/Sim tests

Le but de l'unité de test est de tester la qualité de votre propre code. Les tests unitaires doivent jamais tester la fonctionnalité de facteurs hors de votre contrôle.

Pensez-y de cette façon: Même si vous avez été de tester les fonctionnalités de la carte Arduino bibliothèque, le microcontrôleur du matériel, ou un émulateur, il est absolument impossible pour les résultats de ces tests de vous dire quelque chose à propos de la qualité de votre travail. Par conséquent, il n'y a absolument aucune valeur dans l'écriture de tests unitaires qui s'exécutent sur l'appareil (ou émulateur).

Peu importe si vous envisagez d'exécuter des tests sur l'appareil ou sur un émulateur, vous êtes toujours à vous faire répéter brutalement lent processus d':

  1. Modifier votre code
  2. Compiler et de les télécharger pour Arduino appareil
  3. Observer le comportement et faire des suppositions quant à savoir si ou non il est en marche.
  4. Répétez

L'étape 3 est particulièrement désagréable si vous vous attendez à obtenir les messages de diagnostic via le port série, mais votre projet lui-même a besoin d'utiliser votre Arduino est seulement un port série matériel. Si vous pensez que le SoftwareSerial bibliothèque peut vous aider, vous devez savoir que cela est susceptible de perturber la fonctionnalité qui nécessite un timing précis comme la génération d'autres signaux en même temps. Ce problème m'est arrivé.

Encore une fois, si vous avez été pour tester votre dessin à l'aide d'un émulateur et votre temps critique des routines a parfaitement fonctionné jusqu'à ce que vous avez téléchargés vers le réel de l'Arduino, la seule leçon, vous allez apprendre, c'est que l'émulateur est imparfait--et sachant cela révèle encore rien sur la qualité de votre travail!

Si il est idiot de test sur l'appareil ou l'émulateur, ce qui devrait je faire?

Vous êtes probablement à l'aide d'un ordinateur pour travailler sur votre projet Arduino. Cet ordinateur est littéralement des milliers de fois plus rapide que le microcontrôleur. Écrire les tests pour construire et exécuter sur votre ordinateur.

Rappelez-vous, le comportement de la bibliothèque Arduino et le microcontrôleur doit être supposé corriger ou au moins régulièrement incorrect.

Lors de vos tests de produire un résultat contraire à vos attentes, alors vous avez probablement une faille dans votre code qui a été testé. Si votre test de sortie correspond à vos attentes, mais le programme ne se comporte pas correctement lorsque vous téléchargez à l'Arduino, alors vous savez que votre tests étaient basés sur des hypothèses erronées et que vous avez probablement un défaut de test. Dans les deux cas, vous aurez reçu les bonnes intuitions sur ce qu'est votre prochaine modifications de code devrait être.

Comment créer et Exécuter des Tests sur Votre PC

La première chose que vous devez faire est d'identifier vos objectifs de test. Pensez à ce que les parties de votre propre code que vous voulez tester et puis assurez-vous de construire votre programme de telle façon que vous pouvez isoler les parties discrètes pour les tests.

Si les pièces que vous souhaitez tester toutes les fonctions Arduino, vous devrez fournir la maquette des remplacements dans votre programme de test. C'est beaucoup moins de travail qu'il n'y paraît. Votre mock-ups n'avez pas à faire quoi que ce soit, mais de fournir prévisible d'entrée et de sortie pour vos tests.

Tout de votre propre code que vous avez l'intention de tester les besoins d'exister dans les fichiers sources autres que le .de la pde esquisse. Ne vous inquiétez pas, votre dessin sera toujours compilé même avec un peu de code source à l'extérieur de l'esquisse. Lorsque vous descendez à elle, un peu plus de votre programme normal de point d'entrée doit être défini dans l'esquisse de fichier.

Tout ce qui reste est d'écrire les tests réels et puis le compiler à l'aide de votre favori compilateur C++! C'est probablement la meilleure illustration avec un exemple concret.

Un exemple réel

L'un de mes projets animal trouvé ici a quelques tests simples qui fonctionnent sur le PC. Pour répondre à cette question présentation, je vais juste aller sur la façon dont j'ai raillé certaines des fonctions de bibliothèque Arduino et les tests que j'ai écrit pour tester ces maquettes. Ce n'est pas contraire à ce que j'ai dit avant sur les pas de tester d'autres personnes de code parce que j'ai été celui qui a écrit le mock-ups. Je voulais être certain que mes maquettes étaient correctes.

Source de mock_arduino.cpp qui contient du code qui reproduit certaines fonctionnalités de support fournis par la bibliothèque Arduino:

#include <sys/timeb.h>
#include "mock_arduino.h"

timeb t_start;
unsigned long millis() {
  timeb t_now;
  ftime(&t_now);
  return (t_now.time  - t_start.time) * 1000 + (t_now.millitm - t_start.millitm);
}

void delay( unsigned long ms ) {
  unsigned long start = millis();
  while(millis() - start < ms){}
}

void initialize_mock_arduino() {
  ftime(&t_start);
}

J'utilise la suite de la maquette pour produire lisible de sortie lors de mon code écrit des données binaires dans le matériel de série de l'appareil.

fake_serial.h

#include <iostream>

class FakeSerial {
public:
  void begin(unsigned long);
  void end();
  size_t write(const unsigned char*, size_t);
};

extern FakeSerial Serial;

fake_serial.cpp

#include <cstring>
#include <iostream>
#include <iomanip>

#include "fake_serial.h"

void FakeSerial::begin(unsigned long speed) {
  return;
}

void FakeSerial::end() {
  return;
}

size_t FakeSerial::write( const unsigned char buf[], size_t size ) {
  using namespace std;
  ios_base::fmtflags oldFlags = cout.flags();
  streamsize oldPrec = cout.precision();
  char oldFill = cout.fill();

  cout << "Serial::write: ";
  cout << internal << setfill('0');

  for( unsigned int i = 0; i < size; i++ ){
    cout << setw(2) << hex << (unsigned int)buf[i] << " ";
  }
  cout << endl;

  cout.flags(oldFlags);
  cout.precision(oldPrec);
  cout.fill(oldFill);

  return size;
}

FakeSerial Serial;

et finalement, le programme de test:

#include "mock_arduino.h"

using namespace std;

void millis_test() {
  unsigned long start = millis();
  cout << "millis() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    sleep(1);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void delay_test() {
  unsigned long start = millis();
  cout << "delay() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    delay(250);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void run_tests() {
  millis_test();
  delay_test();
}

int main(int argc, char **argv){
  initialize_mock_arduino();
  run_tests();
}

Ce post est assez long, merci de consulter mon projet sur GitHub pour voir quelques plus de cas de tests dans l'action. - Je garder mes travaux en cours dans les branches autres que le maître, afin de vérifier ces branches pour plus de tests, aussi.

J'ai choisi d'écrire mon propre léger routines de test, mais plus robuste de l'unité de frameworks de test comme CppUnit sont également disponibles.

59voto

Matthew Murdoch Points 11530
<p>En l’absence de tout élément préexistante test cadres pour Arduino, j’ai créé <a href="http://github.com/mmurdoch/arduinounit/">ArduinoUnit</a>. Voici un simple croquis Arduino démontrant son utilisation :<pre><code></code></pre></p>

21voto

David Sykes Points 9683

J'ai beaucoup de succès à l'unité de tester mon PIC de code par l'abstraction du matériel d'accès et de moquerie dans mes tests.

Par exemple, j'ai résumé PORTA avec

#define SetPortA(v) {PORTA = v;}

Puis SetPortA peut facilement se moque de lui, sans l'ajout de la surcharge de code dans le PIC de la version.

Une fois que l'abstraction du matériel a été testé un moment, j'ai bientôt trouver que, généralement, le code va du banc d'essai de la PIC et de travaux des première fois.

Mise à jour:

J'utilise un #include couture pour l'unité de code, #, y compris l'unité de code dans un fichier C++ pour le banc d'essai, et un fichier C pour le code cible.

Un exemple, je veux multiplex quatre à 7 segments affiche, un port de conduite les segments et une deuxième sélection de l'affichage. L'affichage du code des interfaces avec les écrans via l' SetSegmentData(char) et SetDisplay(char). Je peux se moquer de ces dans mon C++ banc d'essai et vérifier que je reçois les données que j'attends. Pour la cible, je utiliser #define alors que je reçois une assignation directe sans l'aide d'un appel de fonction

#define SetSegmentData(x) {PORTA = x;}

15voto

Gonzo Points 179
<p>Il semble <a href="http://hewgill.com/journal/entries/507-emulino-arduino-cpu-emulator">emulino</a> ferait le travail parfaitement.</p>

11voto

Gonzo Points 179

simavr est un AVR simulateur à l'aide de avr-gcc.

Elle soutient déjà quelques ATTiny et ATMega microcontrôleurs, et - selon l'auteur - il est facile d'ajouter un peu plus.

Dans les exemples se trouve simduino, un Arduino émulateur. Il prend en charge l'exécution de l'Arduino bootloader et peut être programmé avec avrdude par Socat (une modification de Netcat).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: