SORU
23 NİSAN 2009, PERŞEMBE


Nasıl birim Arduino kodu test edebilirim?

Arduino benim kod birim test edebilmek istiyorum. İdeal olarak, Arduino için kod yüklemek zorunda kalmadan herhangi testler yapmak mümkün olacak. Araçları ve kütüphaneler bu konuda bana nasıl yardım edebilirsiniz?

Yararlı olabilecek Arduino emulator in development var, ama henüz kullanıma hazır olması için görünmüyor.

AVR AVR Studio yararlı olabilecek chip simülatörü içerir, ama Arduino IDE ile birlikte kullanmak istiyorum nasıl göremiyorum.

CEVAP
11 Temmuz 2012, ÇARŞAMBA


Arduino Cihaz üzerinde Birim Testleri Çalıştırmak veya Emülatör yok

Mikroişlemci Cihazı karşı dava/Öykünücüsü Sım tabanlı testler/

Birim test amacı kendi kod kalitesini test etmektir. Birim testleri gerekiraslasizin kontrolünüz dışındaki faktörlere işlevselliğini sınayın.

Eğer Arduino kütüphane, mikroişlemci donanım veya bir emülatör işlevselliğini test etmek için olsa Bile . bu konuda bu şekilde düşünün: ^em>kesinlikle imkansızbu tür test sonuçları kendi işin kalitesi hakkında bir şey söylemek için. Bu nedenle, kesinlikle yokturhiçbir değerbirim testleri yazarken bu cihazda çalışan (veya emülatör).

Cihazda çalışan testler veya bir emülatör düşünüyorsanız ne olursa olsun, hala kendini acımasızca yavaş bir süreç tekrar ediyorsun:

  1. Kod çimdik
  2. Ve cihaz Arduino için derleyip yükleyin
  3. Davranışlarını gözlemlemek vetahminler yapmakişe yaradığını değil.
  4. Tekrar ediyorum

Adım 3 Eğer seri port üzerinden tanı mesajları ama Arduino sadece donanım seri port kullanmak için kendi ihtiyaçlarını projenizi görmek istiyorsan özellikle kötü. Eğer SoftwareSerial Kütüphanesi yardımcı olabilir düşünüyorsanız, bunu yaparken aynı zamanda diğer sinyalleri üretme gibi doğru zamanlama gerektiren herhangi bir işlevselliği bozacak olası olduğunu bilmeli. Bu çok sorun oldu bana.

Yine, eğer test kroki kullanarak bir emülatör ve zaman-kritik rutinleri koştu kadar mükemmel karşıya gerçek Arduino, sonra tek ders öğreneceksin olduğu taklitçidir kusurlu ve bilerek bu yine de ortaya koymaktadırhiçbir şeykendi işin kalitesi hakkında!

Eğer aptalca bir aygıt ya da öykünücüsü üzerinde test olursa ne olacakgerekirBen?

Muhtemelen bir bilgisayar Arduino sizin proje üzerinde çalışmak için kullanıyorsun. Bu bilgisayar tam anlamıylabinlercekat daha hızlı mikroişlemci daha. Testler oluşturmak için yazıpbilgisayarınızda çalıştırın.

Unutmayın, Arduino Kütüphanesi ve mikro davranış olmalıdırya da doğru olarak kabul ya da en azındansürekliyanlış.

Testlerinizi çıktı beklenenin aksine üretmek, sonra muhtemelen sınandı kodunuzda bir kusur var. Eğer test çıkış maçları beklentilerinizi, ama program değil davranması doğru zaman yüklemek için Arduino, bir de senin testleri dayalı yanlış varsayımlar ve olası bir kusurlu testi. Her iki durumda da, bir sonraki kod değişiklikleri ne olması gerektiği konusunda gerçek bir anlayış getirilmiş olacaktır.

Nasıl ve PC üzerinde Testler Çalıştırmak için

Yapmanız gereken ilk şeytest hedefleri belirlemek. Ne parça düşününkendi kodusen-ebilmek denemek istiyorsun ve o zaman böyle bir program oluşturmak için emin olunayrık parçaları ayırıntest için.

Eğer test etmek istediğiniz parçaları herhangi bir Arduino arama işlevleri, test programı mock-up yedek vermeniz gerekir. Bu göründüğünden daha az iş. Senin maketler aslında hiçbir şey ama testleriniz için sağlayan öngörülebilir giriş ve çıkış yapmak zorunda değilsin.

Test etmek istediğiniz kendi kodunuzu herhangi bir kaynak dosyaları dışında bulunması gerekir .pde kroki. Merak etme, kroki hala çizim dışında bazı kaynak kodu bile derlenir. Gerçekten aşağı geldiğinde, programınızın normal giriş noktası daha çizim dosyasında tanımlanmalıdır.

Geriye kalan tek gerçek testleri yazmak ve favori C derleyici kullanarak derleyin. Bu muhtemelen gerçek dünyadan bir örnek ile en iyi gösterilmiştir.

Gerçek bir çalışma örneği

Evcil hayvan projelerimi here PC üzerinde çalışan bazı basit testler vardır bulundu. Bu cevap verilmesi, sadece ben alay-Arduino kütüphane fonksiyonları ve bu maketler test için yazdığım testleri nasıl geçerim. Bu mock-up yazan bendim çünkü diğer insanların kod test hakkında söylediklerim için değil, tam tersine. Benim maketler doğru olduğuna çok emin olmak istedim.

Bazı destek işlevi çoğaltan kodu Arduino Kütüphanesi tarafından sağlanan içerir mock_arduino.cpp kaynak:

#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);
}

Benim kod donanım seri aygıt için ikili veri yazarken aşağıdaki okunabilir bir çıktı oluşturmak için sahte kullanıyorum.

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;

ve son olarak, gerçek test programı:

#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();
}

Bu yazı çok uzadı, lütfen my project on GitHub eylem daha test bazı durumlar için bkz. Ben ilerletmeye çalışıyor ana dalları dışında tutmak, böylece ekstra testler için o dalları da kontrol edin.

Kendi basit test rutinleri yazmak için seçtim, ama ünite-test CppUnit gibi çerçeveler de mevcuttur daha sağlam.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BDGcustoms

    BDGcustoms

    24 NİSAN 2011
  • Jimmie Jones

    Jimmie Jones

    16 Kasım 2007
  • sghaff1

    sghaff1

    23 Mart 2009