Arduino kodunu nasıl test edebilirim?


187

Arduino kodumu birim test edebilmek istiyorum. İdeal olarak, kodu Arduino'ya yüklemek zorunda kalmadan herhangi bir test yapabilirim. Hangi araçlar veya kütüphaneler bu konuda bana yardımcı olabilir?

Geliştirilmesinde yararlı olabilecek bir Arduino emülatörü var , ancak henüz kullanıma hazır görünmüyor.

Atmel'den AVR Studio , yararlı olabilecek bir çip simülatörü içeriyor, ancak Arduino IDE ile birlikte nasıl kullanacağımı göremiyorum.


Bu soru hakkında 2011'den başka bir konu var arduino.cc/forum/index.php?action=printpage;topic=54356.0
Jakob

Teşekkürler @ Jakob. Bu iş parçacığında başvuruda bulunulan bir Arduino simülatörü (sayfanın altındaki diğer potansiyel olarak yararlı bağlantılar ile): arduino.com.au/Simulator-for-Arduino.html
Matthew Murdoch

5
Ne yazık ki sadece Windows için, sadece herhangi bir kapalı kaynak veya donanım bağımlılığı olmadan komut satırından Arduino kodunu derlemek ve çalıştırmak için bir yol görmek istiyorum.
Jakob

3
5 yıl sonra küçük bir güncelleme: Simavr hala çok aktif ve soru sorulduğundan beri çok gelişti, bu yüzden zirveye yaklaşmayı hak ettiğini düşündüm. Ayrıca, regresyon testi, senaryo tabanlı test ve neden birim test için doğru araç olabilir. Bu şekilde test ettiğiniz kod , hedef donanımdaki kodla aynıdır .
zmo

Önemli projeler için bir donanım test cihazını düşünün; zaman ve test düğmesi / anahtar reaksiyonları, önyükleme süresi, sıcaklık, v / ma kullanımı, garip seçenek permütasyonları, vb. birçok profesyonel cihaz jtag ve ark.
dandavis

Yanıtlar:


137

Arduino Cihazında veya Emülatöründe Birim Testleri Yapmayın

Mikrodenetleyici Cihaz / Emülatör / Sim tabanlı testlere karşı dava

Birim testin ne anlama geldiği hakkında çok fazla tartışma var ve burada bununla ilgili bir tartışma yapmaya çalışmıyorum. Bu mesaj olduğunu değil önlemek için söylüyorum tüm nihai hedef donanım üzerinde pratik test. Hedef donanımınızı en sıradan ve sık testlerden kaldırarak geliştirme geri bildirim döngünüzü optimize etme konusunda bir noktaya değinmeye çalışıyorum. Test edilen birimlerin tüm projeden çok daha küçük olduğu varsayılmaktadır.

Birim testinin amacı, kendi kodunuzun kalitesini test etmektir. Birim testleri genellikle kontrolünüz dışındaki faktörlerin işlevselliğini asla test etmemelidir.

Bunu şu şekilde düşünün: Arduino kütüphanesinin, mikrodenetleyici donanımının veya bir emülatörün işlevselliğini test etseniz bile, bu tür test sonuçlarının size kendi çalışmanızın kalitesi hakkında bir şey söylemesi kesinlikle imkansızdır . Bu nedenle, hedef cihazda (veya emülatörde) çalışmayan birim testleri yazmak çok daha değerli ve etkilidir.

Hedef donanımınız üzerinde sık yapılan testlerin acı verici yavaş bir döngüsü vardır:

  1. Kodunuzu değiştirin
  2. Derleyin ve Arduino cihazına yükleyin
  3. Davranışını gözlemleyin ve olmadığını tahmin senin kod beklediğiniz yapıyor
  4. Tekrar et

Adım 3, özellikle seri bağlantı noktası üzerinden tanılama mesajları almayı bekliyorsanız, ancak projenizin Arduino'nun tek donanım seri bağlantı noktasını kullanması gerekiyorsa özellikle kötüdür. SoftwareSerial kütüphanesinin yardımcı olabileceğini düşünüyorsanız, bunu yapmanın aynı anda diğer sinyalleri üretmek gibi doğru zamanlama gerektiren herhangi bir işlevselliği bozacağını bilmelisiniz. Bu sorun benim başıma geldi.

Yine, çiziminizi bir emülatör kullanarak test edecekseniz ve zaman açısından kritik rutinleriniz gerçek Arduino'ya yüklenene kadar mükemmel bir şekilde çalıştıysa, öğreneceğiniz tek ders emülatörün kusurlu olması ve bunu hala bilmesidir. kendi işinizin kalitesi hakkında hiçbir şey ortaya çıkarmaz .

O aygıt veya emülatörünüzde testine saçma olursa, ne olmalı yapmam?

Muhtemelen Arduino projenizde çalışmak için bir bilgisayar kullanıyorsunuz. Bu bilgisayar mikrodenetleyiciden daha hızlı büyüklük sırasıdır. Bilgisayarınızda oluşturmak ve çalıştırmak için testleri yazın .

Unutmayın, Arduino kütüphanesinin ve mikrodenetleyicinin davranışının ya doğru ya da en azından tutarlı bir şekilde yanlış olduğu varsayılmalıdır .

Testleriniz beklentilerinizin aksine çıktı ürettiğinde, muhtemelen kodunuzda test edilmiş bir kusur vardır. Test çıktınız beklentilerinize uyuyorsa, ancak Arduino'ya yüklediğinizde program doğru davranmıyorsa, testlerinizin yanlış varsayımlara dayandığını ve muhtemelen hatalı bir testiniz olduğunu biliyorsunuzdur. Her iki durumda da, bir sonraki kod değişikliğinizin ne olması gerektiği konusunda size gerçek bilgiler verilecektir. Geribildiriminiz kalitesi "dan artırıldı şey için bozuldu" "Bu özel kod bozuldu" .

Bilgisayarınızda Test Oluşturma ve Çalıştırma

Yapmanız gereken ilk şey test hedeflerinizi belirlemektir . Kendi kodunuzun hangi bölümlerini test etmek istediğinizi düşünün ve ardından programınızı ayrı parçaları test için izole edebileceğiniz şekilde oluşturduğunuzdan emin olun .

Test etmek istediğiniz parçalar herhangi bir Arduino işlevini çağırırsa, test programınızda maket yedekleri sağlamanız gerekir. Bu göründüğünden çok daha az iş. Maketlerinizin testleriniz için öngörülebilir girdi ve çıktı sağlamaktan başka bir şey yapmasına gerek yoktur.

Test etmek istediğiniz kendi kodunuzun .pde çizimi dışındaki kaynak dosyalarda bulunması gerekir. Endişelenmeyin, çiziminiz, çizimin dışındaki bazı kaynak kodlarıyla bile derlenecektir. Gerçekten aşağı indiğinizde, çizim dosyasında programınızın normal giriş noktasından biraz daha fazlası tanımlanmalıdır.

Geriye kalan tek şey, gerçek testleri yazmak ve en sevdiğiniz C ++ derleyicisini kullanarak derlemek! Bu muhtemelen en iyi gerçek dünya örneği ile gösterilebilir.

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

Benim evcil projelerden biri bulundu burada PC'de çalıştırmak bazı basit testler vardır. Bu cevap gönderimi için, sadece bazı Arduino kütüphane fonksiyonlarını nasıl taktığımı ve bu maketleri test etmek için yazdığım testleri inceleyeceğim. Bu, daha önce başkalarının kodlarını test etmeme hakkında söylediğim şeylerin aksine değil, çünkü maketleri yazan ben oldum. Modellerimin doğru olduğundan çok emin olmak istedim.

Arduino kütüphanesi tarafından sağlanan bazı destek işlevlerini kopyalayan kodu içeren mock_arduino.cpp kaynağı:

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

Kodum donanım seri aygıtına ikili veri yazdığında okunabilir çıktı üretmek için aşağıdaki mock-up kullanın.

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ı yeterince uzun, bu yüzden bazı test senaryolarını görmek için lütfen GitHub'daki projeme bakın. Devam etmekte olan çalışmalarımı master dışındaki dallarda tutuyorum, bu yüzden bu dalları da ekstra testler için kontrol edin.

Kendi hafif test rutinlerimi yazmayı seçtim, ancak CppUnit gibi daha sağlam birim testi çerçeveleri de mevcut.


1
Bu harika bir cevap! Teşekkür ederim!
Jonathan Arkell

5
@WarrenMacEvoy Yine, tavsiyemi aldınız ve olmayan bir şey haline getirdiğinizi düşünüyorum. BAZI NOKTA, gerçek ortamında kodunuzu kesinlikle test etmelisiniz. Benim iddiam, bunu her gün yapmamanız ve kesinlikle bir birim testi dememenizdir.
Iron Savior

1
@toasted_flakes Bu teklifi nereden aldığınızdan emin değilim, ama söylediğim bir şey değil. Cihazda çalışan birim testlerinde çok fazla sorun var - çok yavaş geri bildirim döngüsü, hedef cihazınıza yedeklemek için herhangi bir seri portunuz veya başka bir IO yönteminiz olmayabilir ve bunların kapsamını etkileyebilecek çok sınırlı kapasiteye sahiptirler. test takımınız.
Demir Kurtarıcı

1
@ChristianHujer Kesinlikle gerçek donanımı test etmelisiniz - hiç kimse hedef donanımı test etmemeniz gerektiğini söylemiyor. Mesajım, geliştirme makinenizde birim test ederek günlük gelişim geri bildirim döngünüzü sıkılaştırmakla ilgili. Test ek yükünüz bu şekilde minimize edilir, çünkü hedef donanımınızı yalnızca gerektiğinde test edersiniz.
Demir Kurtarıcı

1
@ Benjohn Arduino eskiz kaynak dosyaları, C ++ olsalar bile "pde" uzantısına sahipti. arduino.cc/en/Guide/Environment#toc1
Iron Savior

63

Arduino için önceden var olan birim test çerçevelerinin yokluğunda ArduinoUnit oluşturdum . İşte kullanımını gösteren basit bir Arduino çizimi:

#include <ArduinoUnit.h>

// Create test suite
TestSuite suite;

void setup() {
    Serial.begin(9600);    
}

// Create a test called 'addition' in the test suite
test(addition) {
    assertEquals(3, 1 + 2);
}

void loop() {
    // Run test suite, printing results to the serial port
    suite.run();
}

18
Testler sadece arduino'da çalışıyor gibi görünüyor, bu yüzden bunları geliştirme makinenizde otomatik olarak çalıştıramazsınız. Birim testlerinin temel fikri, bunları otomatik olarak çalıştırmaktır, bu nedenle mevcut tasarım daha çok bir hata ayıklama aracı gibi görünüyor, ancak gerçek bir birim test çerçevesi yok.
Jakob

1
Haklısın. Bunları bir PC'de çalıştırabilmek için ayrıca bir Arduino veya AVR emülatörü gerekir. Arduino kütüphanelerinde gerçek bir donanım soyutlama katmanı yok (şu anda) ve baktığımda AVR emülatörlerinin hepsi hala geliştiriliyordu. Eğer işler şimdi devam etmişse, prensipte bu yapılabilirdi.
Matthew Murdoch

12
@MatthewMurdoch Yanlış olduğunuzdan korkuyorum. Tanım gereği, birim testleri hiçbir zaman hedef ortamda çalıştırılmaz. Aslında, birim testinin ardındaki fikir, hedef ortamı testten tamamen ortadan kaldırmaktır. Her zaman, testin başarılı veya başarısız olmasının SADECE test edilen üniteye yansıtılmasını sağlamak için test edilen ünitenin dışındaki tüm aktiviteleri alay eden laboratuar benzeri bir ortamda çalıştırılırlar. Bu, insanların Inversion of Control kavramını karmaşık projelerde kullanmasının en büyük nedenlerinden biridir.
Demir Kurtarıcı

2
@ marcv81 Bu tür taşınabilirlik sorunlarının bulunduğu alanların birim test için zayıf konular olması muhtemeldir. Birim testlerinin yalnızca SİZİN kodunuzu test etmesi gerektiğini unutmayın, bu nedenle kapsamlarını uygun şekilde sınırlayın. Burada bahsettiğimiz donanımdaki büyük eşitsizlikle, bu tür bazı koşulların kaçınılmaz olabileceğini kabul edebilirim. Bu durumlarda, bir mühendis bilişsel kalmalı ve hafifletici adımlar atmalıdır. Bu, test edilebilirliği geliştirmek için tasarımınızı değiştirmek veya hatta sadece ilgili gerçekleri belgelemek kadar basit bir şey anlamına gelebilir.
Demir Kurtarıcı

2
@ Demir Kurtarıcı birim testi kodunuzu test eder, ancak kodunuz bir yerde çalışır. Bu bağlam bir Arduino bağlamı veya öykünüyorsa; ArdunoUnit birim testleri yazmanıza yardımcı olacaktır. ArduinoUnit projesine bakarsanız, çerçevenin meta-testi, platformlar arası hedefe test sonuçlarını otomatik olarak yükler, çalıştırır ve doğrular. Tıpkı diğer platformlar arası hedeflerde yapacağınız gibi. Bakış açınız, doğruluğun diğer bağlamlardan çok daha fazla olmasa da çok önemli olduğu gömülü bir ortamda kodu test etmemek için bir mazerettir.
Warren MacEvoy

21

Donanım erişimini soyutlayıp testlerimde alay ederek PIC kodumu test eden önemli bir başarı birimim var.

Örneğin, PORTA'yı

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

Daha sonra SetPortA, PIC versiyonuna ek kod eklemeden kolayca taklit edilebilir.

Donanım soyutlaması bir süre test edildiğinde, yakında kodun test cihazından PIC'ye gittiğini ve ilk kez çalıştığını görüyorum.

Güncelleme:

Birim kodu için #include dikiş, # test teçhizatı için bir C ++ dosyasında birim kodu ve hedef kod için bir C dosyası dahil #.

Örnek olarak, dört adet 7 segmentli ekranı, bir adet segmenti tahrik eden ve bir diğeri de ekranı seçerek çoğaltmak istiyorum. Aracılığıyla ekranlara sahip görüntülü kod arayüzleri SetSegmentData(char)ve SetDisplay(char). Bu benim C ++ test teçhizat alay ve beklediğim veri olsun kontrol edin. Hedef #defineiçin bir işlev çağrısının ek yükü olmadan doğrudan atama almak için kullanıyorum

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

Prensipte önişlemci 'dikişini' birim testi için nasıl kullanabileceğimi görebiliyorum. Ancak, testleri çalıştırmak için bir emülatör veya Windows ikili dosyaları veren bir avr-gcc uyumlu derleyici olmadan bunu nasıl yapabileceğimden emin değilim ...
Matthew Murdoch

Güncelleme için teşekkürler. Birim testlerini PIC veya PC'nizde mi yürütüyorsunuz?
Matthew Murdoch

Birim testleri Xcode kullanılarak bir Mac üzerinde gerçekleştirilir. Onları Pic üzerinde çalıştırmak için muhtemelen bir tür emülatöre ihtiyaç duyacaktır. Mac üzerinde çalıştığı için soyutlama, anahtarlama işlemcilerini çok daha kolay hale getiriyor
David Sykes

Arduino ortamı, gcc (veya başka bir C ++ derleyicisi) ile derlemenin ve bir bilgisayarda çalışmanın, kodun avr-gcc'de de derleneceği anlamına gelmeyeceği anlamına gelen bazı kendine özgü ifadeleri olan avr-gcc derleyicisini kullanır.
Matthew Murdoch

Ne tür bir farklılıktan bahsediyorsun? Bazı önişlemci direktifleriyle ele alınamayan şeyler mi?
Joseph Lisee


12

simavr , avr-gcc kullanan bir AVR simülatörüdür .

Zaten birkaç ATTiny ve ATMega mikrodenetleyicisini destekliyor ve yazara göre biraz daha eklemek çok kolay.

Örneklerde bir Arduino emülatörü olan simduino yatıyor. Arduino önyükleyicisini çalıştırmayı destekler ve Socat (modifiye edilmiş bir Netcat ) aracılığıyla ortalama olarak programlanabilir .


9

Projemle Python'da birim testi yapabilirsiniz, Projem PySimAVR . Arscons , simülasyon için bina ve simavr için kullanılır .

Misal:

from pysimavr.sim import ArduinoSim    
def test_atmega88():
    mcu = 'atmega88'
    snippet = 'Serial.print("hello");'

    output = ArduinoSim(snippet=snippet, mcu=mcu, timespan=0.01).get_serial()
    assert output == 'hello'

Testi başlat:

$ nosetests pysimavr/examples/test_example.py
pysimavr.examples.test_example.test_atmega88 ... ok

6

Arduino kodunu test edebilecek herhangi bir platformun farkında değilim.

Bununla birlikte, donanımı modellemek ve daha sonra dışa aktarma PCB diyagramları ve şeyleri için kullanabileceğiniz Fritzing platformu vardır .

Kontrol etmeye değer.


6

Büyük bir bilimsel deneyde veri toplamak için Arduino kartlarını kullanıyoruz. Daha sonra, farklı uygulamalara sahip birkaç Arduino kartını desteklemeliyiz. Birim testi sırasında Arduino hex görüntülerini dinamik olarak yüklemek için Python yardımcı programları yazdım. Aşağıdaki bağlantıda bulunan kod, bir yapılandırma dosyası aracılığıyla Windows ve Mac OS X'i destekler. Onaltılık görüntülerinizin Arduino IDE tarafından nereye yerleştirildiğini öğrenmek için, oluştur (oynat) düğmesine basmadan önce üst karakter tuşuna basın. Avrdude'unuzun (komut satırı yükleme yardımcı programı) sisteminizde / Arduino sürümünüzde nerede olduğunu bulmak için karşıya geçerken shift tuşuna basın. Alternatif olarak, verilen yapılandırma dosyalarına bakabilir ve kurulum konumunuzu kullanabilirsiniz (şu anda Arduino 0020'de).

http://github.com/toddstavish/Python-Arduino-Unit-Testing


+1 Harika şeyler! Resimler yüklendikten sonra birim testinizi nasıl yaptığınız hakkında herhangi bir bilginiz var mı?
Matthew Murdoch

Birim testlerimizi python tarafında yürütmek için nosetest kullandık. Her test için kurulum, o test için doğru onaltılık görüntüyü yükler. Küçük başlıyoruz ve daha kapsamlı testler yapmaya çalışıyoruz. Seri iletişimin çalıştığından emin olun, kullanıcı arayüzüne seri entegrasyonunun çalıştığından emin olun, seriyi DB entegrasyonuna vb. Kontrol edin. Analog_read_speed pde ve py bunun temellerini gösterir (yukarıdaki github bağlantısına bakın). Sonunda, tüm projeyi açık kaynak yapacağız, bu yüzden lütfen bizi izlemeye devam edin. :)
toddstavish

6

Bu program birkaç Arduino birim testinin otomatik olarak çalıştırılmasını sağlar. Test işlemi bilgisayarda başlatılır ancak testler gerçek Arduino donanımında çalışır. Bir birim test seti tipik olarak bir Arduino kütüphanesini test etmek için kullanılır. (bu

Arduino Forumu: http://arduino.cc/forum/index.php?topic=140027.0

GitHub proje sayfası: http://jeroendoggen.github.com/Arduino-TestSuite

Python Paket Endeksindeki Sayfa: http://pypi.python.org/pypi/arduino_testsuite

Birim testleri "Arduino Birim Test Kütüphanesi" ile yazılmıştır: http://code.google.com/p/arduinounit

Her birim test seti için aşağıdaki adımlar gerçekleştirilir:

  • Hangi testlerin çalıştırılacağını bulmak için yapılandırma dosyasını okuyun
  • Komut dosyası, birim test kodunu içeren bir Arduino taslağını derler ve yükler.
  • Ünite testleri Arduino kartında yapılır.
  • Testin sonuçları seri port üzerinden yazdırılır ve Python betiği ile analiz edilir.
  • Komut dosyası, bir sonraki testi başlatır ve yapılandırma dosyasında istenen tüm testler için yukarıdaki adımları tekrarlar.
  • Komut dosyası, tüm test alanındaki tüm başarısız / başarılı testlere genel bir bakış gösteren bir özet yazdırır.

5

Donanıma özgü kodu diğerlerinden ayrı veya soyutlanmış tutun, böylece iyi araçlara sahip olduğunuz ve en çok tanıdığınız platformlarda daha büyük "dinlenme" yi test edip hatalarını ayıklayabilirsiniz.

Temel olarak, mümkün olduğu kadar çok bilinen işe yarayan yapı taşlarından nihai kodun çoğunu oluşturmaya çalışın. Geri kalan donanıma özgü işler çok daha kolay ve hızlı olacaktır. Mevcut emülatörleri ve / veya kendi başınıza taklit cihazları kullanarak bitirebilirsiniz. Ve sonra, elbette, gerçek şeyi bir şekilde test etmeniz gerekir. Koşullara bağlı olarak, bu çok iyi otomatikleştirilebilir veya olmayabilir (örn. Düğmelere kim veya ne basacak ve diğer girişler sağlayacak? Çeşitli göstergeleri ve çıkışları kim veya ne gözlemleyecek ve yorumlayacak?).



5

Arduino kodunu yazarken Searduino kullanıyorum . Searduino, en sevdiğiniz editörü kullanarak C / C ++ 'da hacklemeyi kolaylaştıran bir Arduino simülatörü ve geliştirme ortamıdır (Makefiles, C kodu ...). Arduino çizimlerini içe aktarabilir ve simülatörde çalıştırabilirsiniz.

Searduino 0.8 ekran görüntüsü: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png

Searduino 0.9 piyasaya sürülecek ve son testler biter bitmez bir video kaydedilecektir .... bir veya iki gün içinde.

Simülatör üzerinde test yapmak gerçek testler olarak düşünülmemelidir, ancak kesinlikle aptal / mantıklı hatalar bulmamda çok yardımcı oldu (yapmayı unutmak pinMode(xx, OUTPUT), vb.).

BTW: Ben Searduino'yu geliştiren insanlardan biriyim.


5

arduino_ciBu amaçla inşa ettim . Arduino kitaplıklarını test etmekle (bağımsız çizimler değil) sınırlı olmakla birlikte, birim testlerinin yerel olarak veya bir CI sisteminde (Travis CI veya Appveyor gibi) yapılmasını sağlar.

Denilen, senin Arduino Kütüphanesi dizinde çok basit kütüphane düşünün DoSomethingile do-something.cpp:

#include <Arduino.h>
#include "do-something.h"

int doSomething(void) {
  return 4;
};

Üniteyi aşağıdaki gibi test edersiniz (denilen bir test dosyası test/is_four.cppveya benzeri bir testle ):

#include <ArduinoUnitTests.h>
#include "../do-something.h"

unittest(library_does_something)
{
  assertEqual(4, doSomething());
}

unittest_main()  // this is a macro for main().  just go with it.

Bu kadar. O takdirde assertEqualsöz dizimi ve test yapısı tanıdık görünüyor ben bazılarını kabul, bunun sebebi Matthew Murdoch'ın ArduinoUnit kütüphanesinde o atıfta o onun cevabını .

Ünite test G / Ç pimleri, saat, Seri bağlantı noktaları vb. Hakkında daha fazla bilgi için Reference.md dosyasına bakın .

Bu birim testleri bir yakut taşında bulunan bir komut dosyası kullanılarak derlenir ve çalıştırılır. Bunu nasıl ayarlayacağınıza ilişkin örnekler için README.md dosyasına bakın veya yalnızca aşağıdaki örneklerden birinden kopyalayın:


Bu ilginç görünüyor, ancak Arduino kodunu doğru bir şekilde test ettiğinden emin değilim. Yayınladığınız çıktıdan, açıkça Arduino için kullanılmayan x86_64 mimarisini derliyor. Bu, tür uygulamaları arasındaki çakışmaların neden olduğu hataları ortaya çıkarabilir.
Cerin

Bu tür bir hata kesinlikle mümkündür. Test senaryosu için kullanabileceğim bir örnek var mı?
Ian

3

Arduino için yerli çekirdek sağlayan ncore adlı bir proje var . Ve Arduino kodu için testler yazmanıza izin verir.

Proje açıklamasından

Yerel çekirdek, genellikle hiçbir değişiklik yapmadan PC'de Arduino skeçlerini derlemenizi ve çalıştırmanızı sağlar. Standart Arduino işlevlerinin yerel sürümlerini ve çiziminize normalde donanımın kendisinden gelen girdileri vermek için bir komut satırı ara birimi sağlar.

Ayrıca "ne kullanmam gerekiyor" bölümünde

Testleri oluşturmak istiyorsanız, http://cxxtest.tigris.org adresinden cxxtest'e ihtiyacınız olacaktır . NCORE cxxtest 3.10.1 ile test edilmiştir.


Bu ilginç bir proje. Ne yazık ki, 6 yıldır ilerleme kaydedilmediğinden artık ölü gibi görünüyor.
Cerin

2

Kodu MCU dışında (masaüstünde) birim test etmek istiyorsanız, libcheck'e göz atın: https://libcheck.github.io/check/

Kendi gömülü kodumu birkaç kez test etmek için kullandım. Oldukça sağlam bir çerçeve.


Tek dezavantajı, bu, C ++ özelliklerini kullanan çoğu Arduino kütüphanesini test etmek için işe yaramaz hale getiren g ++ 'yı desteklememesidir.
Cerin

1

Emulare kullanabilirsiniz - bir mikro denetleyiciyi bir diyagram üzerinde sürükleyip bırakabilir ve kodunuzu Eclipse'de çalıştırabilirsiniz. Web sitesindeki belgeler size nasıl ayarlanacağınızı anlatır.


1

Kodunuzu hata ayıklamak veya test etmek için Arduino kütüphanesi ile Proteus VSM kullanın.

Kodunuzu yerleşik hale getirmeden önce en iyi uygulamadır, ancak zamanlamalardan emin olun çünkü simülasyon tahtada çalışırken gerçek zamanlı olarak çalışmaz.


1

Autodesk devre simülatörünü deneyin . Arduino kodunu ve devrelerini diğer birçok donanım bileşeniyle test etmeyi sağlar.


0

Temelde Arduino C ve C ++ ile yazılır, arduino kütüphaneleri bile C ve C ++ ile yazılır. Yani, basit terimlerle kodu C ve C ++ olarak ele alıp birim testi yapmayı deneyin. Burada, "tanıtıcı" kelimesi ile seri.println gibi tüm temel sözdizimini sysout, pinmode varaibles, void loop to while () döngüsüne ya da anahtar stoğunda ya da bazı yinelemeden sonra değiştirmek anlamına gelir.

Bunun biraz uzun bir süreç olduğunu ve çok da ileri olmadığını biliyorum.

-Nandha_Frost


0

Bir INO taslağını çalıştırmak ve seri çıkışı kontrol etmekle ilgileniyorsanız, Arduino NMEA sağlama toplamı projemde bunun çalışan bir uygulaması var .

Aşağıdaki komut dosyası dosyayı alır ve bir HEX dosyasına derlemek için Arduino CLI kullanır; bu dosya daha sonra dosyayı değerlendiren ve seri çıktıyı basan SimAVR'a yüklenir. Tüm Arduino programları gerçekten kendilerini öldürme seçeneğine sahip olmadan sonsuza kadar exit(0)çalıştığından ( çalışmaz), eskizin birkaç saniye çalışmasına izin verdim ve sonra yakalanan çıktıyı beklenen çıktı ile dağıtırım.

Arduino CLI'yi indirin ve çıkarın (bu durumda sürüm 0.5.0 - en son yazma sırasında):

curl -L https://github.com/arduino/arduino-cli/releases/download/0.5.0/arduino-cli_0.5.0_Linux_64bit.tar.gz -o arduino-cli.tar.gz
tar -xvzf arduino-cli.tar.gz

Şimdi dizini güncelleyebilir ve uygun çekirdeği yükleyebilirsiniz:

./arduino-cli core update-index
./arduino-cli core install arduino:avr

Eskizinizin adlandırıldığını varsayarak, nmea-checksum.inoELF ve HEX'i almak için şunu çalıştırın:

./arduino-cli compile -b arduino:avr:uno nmea-checksum.ino

Şimdi, SimAVR HEX (veya ELF) çalıştırmak için - Kaynaktan inşa ediyorum çünkü en son sürüm benim için çalışmadı:

sudo apt-get update
sudo apt-get install -y build-essential libelf-dev avr-libc gcc-avr freeglut3-dev libncurses5-dev pkg-config
git clone https://github.com/buserror/simavr.git
cd simavr
make

Başarılı derleme simavr/run_avr, çizimi çalıştırmak için kullanabileceğinizi verecektir . Dediğim gibi, timeoutaksi takdirde asla sona ermeyecektir:

cd simavr
timeout 10 ./run_avr -m atmega168 -f 16000000 ../../nmea-checksum.ino.arduino.avr.uno.elf &> nmea-checksum.ino.clog || true

Oluşturulan dosya, bunlardan kurtulmak için seri çıktıyı saran ANSI renk kodu kontrol karakterlerine sahip olacaktır:

cat nmea-checksum.ino.clog | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" > nmea-checksum.ino.log
cat nmea-checksum.ino.log

Şimdi tek yapmanız gereken bu dosyayı bilinen iyi bir dosyayla karşılaştırmak:

diff nmea-checksum.ino.log ../../nmea-checksum.ino.test

Hiçbir fark diffyoksa, kod 0 ile çıkar, aksi takdirde komut dosyası başarısız olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.