Bagaimana saya bisa menguji kode Arduino unit?

187

Saya ingin dapat menguji unit kode Arduino saya. Idealnya, saya dapat menjalankan tes apa pun tanpa harus mengunggah kode ke Arduino. Alat atau perpustakaan apa yang dapat membantu saya dengan ini?

Ada emulator Arduino dalam pengembangan yang bisa bermanfaat, tetapi tampaknya belum siap untuk digunakan.

AVR Studio dari Atmel berisi simulator chip yang bisa berguna, tetapi saya tidak bisa melihat bagaimana saya akan menggunakannya bersamaan dengan Arduino IDE.

Matthew Murdoch
sumber
Ada utas lain tentang pertanyaan ini dari 2011 di arduino.cc/forum/index.php?action=printpage;topic=54356.0
Jakob
Terima kasih @ Jakob. Simulator Arduino direferensikan di utas itu (dengan tautan yang berpotensi bermanfaat lainnya di bagian bawah halaman): arduino.com.au/Simulator-for-Arduino.html
Matthew Murdoch
5
Sayangnya ini hanya untuk Windows, saya ingin melihat cara untuk hanya mengkompilasi dan menjalankan kode Arduino dari baris perintah tanpa sumber tertutup atau dependensi perangkat keras.
Jakob
3
Sedikit pembaruan, 5 tahun kemudian: Simavr masih sangat aktif dan telah meningkat banyak sejak pertanyaannya diajukan, jadi saya pikir pantas untuk ditabrak lebih dekat ke atas. Dan itu bisa menjadi alat yang tepat untuk pengujian regresi, pengujian berbasis skenario dan mengapa tidak juga pengujian unit. Dengan begitu kode yang Anda uji sama dengan yang ada di perangkat keras target.
zmo
Untuk proyek-proyek penting, pertimbangkan penguji perangkat keras; MCU lain dari waktu dapat dan uji tombol / alihkan reaksi, waktu boot, temp, penggunaan v / ma, permutasi opsi aneh, dll. Ya, ini lebih sulit untuk dibangun, tetapi dapat menambahkan lapisan pengaman ke pembuatan revisi. banyak perangkat pro menggunakan jtag et al.
Dandavis

Jawaban:

137

Jangan Jalankan Tes Unit pada Perangkat Arduino atau Emulator

Kasing terhadap mikrokontroler Perangkat / Emulator / tes berbasis Sim

Ada banyak diskusi tentang apa arti unit test dan saya tidak benar-benar mencoba untuk membuat argumen tentang itu di sini. Posting ini tidak memberitahu Anda untuk menghindari semua pengujian praktis pada perangkat keras target utama Anda. Saya mencoba membuat poin tentang mengoptimalkan siklus umpan balik pengembangan Anda dengan menghilangkan perangkat keras target Anda dari tes yang paling biasa dan sering. Unit-unit yang diuji diasumsikan jauh lebih kecil dari keseluruhan proyek.

Tujuan pengujian unit adalah untuk menguji kualitas kode Anda sendiri. Tes unit umumnya tidak boleh menguji fungsionalitas faktor di luar kendali Anda.

Pikirkan seperti ini: Bahkan jika Anda menguji fungsionalitas perpustakaan Arduino, perangkat keras mikrokontroler, atau emulator, sama sekali tidak mungkin bagi hasil tes tersebut untuk memberi tahu Anda apa pun tentang kualitas pekerjaan Anda sendiri. Oleh karena itu, jauh lebih berharga dan efisien untuk menulis unit test yang tidak berjalan pada perangkat target (atau emulator).

Pengujian yang sering dilakukan pada perangkat keras target Anda memiliki siklus yang sangat lambat:

  1. Tweak kode Anda
  2. Kompilasi dan unggah ke perangkat Arduino
  3. Amati perilaku dan tebak apakah kode Anda melakukan apa yang Anda harapkan
  4. Ulang

Langkah 3 sangat tidak menyenangkan jika Anda berharap mendapatkan pesan diagnostik melalui port serial tetapi proyek Anda sendiri perlu menggunakan port serial perangkat keras Arduino Anda saja. Jika Anda berpikir bahwa pustaka SoftwareSerial mungkin membantu, Anda harus tahu bahwa melakukan hal itu kemungkinan akan mengganggu fungsionalitas yang memerlukan waktu akurat seperti menghasilkan sinyal lain pada saat yang sama. Masalah ini terjadi pada saya.

Sekali lagi, jika Anda menguji sketsa Anda menggunakan emulator dan rutinitas kritis waktu Anda berjalan dengan sempurna sampai Anda mengunggah ke Arduino yang sebenarnya, maka satu-satunya pelajaran yang akan Anda pelajari adalah bahwa emulator itu cacat - dan mengetahui hal ini masih tidak mengungkapkan apa pun tentang kualitas pekerjaan Anda sendiri .

Jika konyol untuk menguji pada perangkat atau emulator, apa yang harus saya lakukan?

Anda mungkin menggunakan komputer untuk mengerjakan proyek Arduino Anda. Komputer itu adalah urutan besarnya lebih cepat dari mikrokontroler. Tulis tes untuk dibangun dan dijalankan di komputer Anda .

Ingat, perilaku perpustakaan dan mikrokontroler Arduino harus dianggap benar atau setidaknya secara konsisten salah .

Ketika tes Anda menghasilkan output yang bertentangan dengan harapan Anda, maka kemungkinan Anda memiliki cacat pada kode Anda yang diuji. Jika hasil pengujian Anda sesuai dengan harapan Anda, tetapi program tersebut tidak berlaku dengan benar ketika Anda mengunggahnya ke Arduino, maka Anda tahu bahwa pengujian Anda didasarkan pada asumsi yang salah dan Anda kemungkinan memiliki tes yang cacat. Dalam kedua kasus tersebut, Anda akan diberi wawasan nyata tentang apa yang harus diubah oleh kode Anda selanjutnya. Kualitas umpan balik Anda ditingkatkan dari " ada yang rusak" menjadi " kode khusus ini rusak" .

Cara Membangun dan Menjalankan Tes di PC Anda

Hal pertama yang perlu Anda lakukan adalah mengidentifikasi tujuan pengujian Anda . Pikirkan bagian mana dari kode Anda sendiri yang ingin Anda uji dan kemudian pastikan untuk membangun program Anda sedemikian rupa sehingga Anda dapat mengisolasi bagian - bagian terpisah untuk pengujian.

Jika bagian yang ingin Anda uji memanggil fungsi Arduino, Anda harus memberikan penggantian tiruan dalam program pengujian Anda. Ini jauh lebih sedikit dari yang terlihat. Mock-up Anda tidak harus melakukan apa pun selain memberikan input dan output yang dapat diprediksi untuk pengujian Anda.

Kode Anda sendiri yang ingin Anda uji perlu ada dalam file sumber selain sketsa .pde. Jangan khawatir, sketsa Anda masih akan dikompilasi bahkan dengan beberapa kode sumber di luar sketsa. Ketika Anda benar-benar turun ke sana, sedikit lebih dari titik masuk normal program Anda harus didefinisikan dalam file sketsa.

Yang tersisa hanyalah menulis tes yang sebenarnya dan kemudian mengompilasinya menggunakan kompiler C ++ favorit Anda! Ini mungkin paling baik digambarkan dengan contoh dunia nyata.

Contoh kerja aktual

Salah satu proyek kesayangan saya yang ditemukan di sini memiliki beberapa tes sederhana yang berjalan di PC. Untuk pengajuan jawaban ini, saya akan membahas bagaimana saya mengejek beberapa fungsi perpustakaan Arduino dan tes yang saya tulis untuk menguji tiruan tersebut. Ini tidak bertentangan dengan apa yang saya katakan sebelumnya tentang tidak menguji kode orang lain karena saya adalah orang yang menulis maket. Saya ingin sangat yakin bahwa tiruan saya benar.

Sumber mock_arduino.cpp, yang berisi kode yang menduplikasi beberapa fungsi dukungan yang disediakan oleh perpustakaan 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);
}

Saya menggunakan mock-up berikut untuk menghasilkan output yang dapat dibaca ketika kode saya menulis data biner ke perangkat serial perangkat keras.

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;

dan akhirnya, program tes yang sebenarnya:

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

Posting ini cukup panjang, jadi silakan merujuk ke proyek saya di GitHub untuk melihat beberapa kasus uji lagi yang sedang beraksi. Saya menyimpan pekerjaan saya yang sedang berlangsung di cabang selain master, jadi periksa cabang-cabang itu untuk tes tambahan juga.

Saya memilih untuk menulis rutin pengujian ringan saya sendiri, tetapi kerangka kerja unit-test yang lebih kuat seperti CppUnit juga tersedia.

Juruselamat Besi
sumber
1
Ini jawaban yang bagus! Terima kasih!
Jonathan Arkell
5
@ WarrenMacEvoy Sekali lagi, saya pikir Anda telah mengambil saran saya dan membuatnya menjadi sesuatu yang bukan. Anda tentu harus menguji kode Anda di lingkungan yang sebenarnya AT BEBERAPA POINT. Argumen saya adalah bahwa Anda tidak harus melakukan itu setiap hari dan Anda tentu tidak boleh menyebutnya sebagai unit test.
Iron Savior
1
@ toasted_flakes Saya tidak yakin dari mana Anda mendapatkan penawaran itu, tapi itu bukan sesuatu yang saya katakan. Tes unit yang berjalan pada perangkat memiliki banyak masalah - umpan balik yang sangat lambat, Anda mungkin tidak memiliki port serial atau sarana IO lainnya untuk digunakan pada perangkat target Anda, dan mereka memiliki kapasitas yang sangat terbatas yang dapat berdampak pada ruang lingkup suite tes Anda.
Iron Saviour
1
@ChristianHujer Anda tentu harus menguji pada perangkat keras nyata - tidak ada yang mengatakan Anda tidak boleh menguji pada perangkat keras target. Posting saya adalah tentang memperketat siklus umpan balik pengembangan harian Anda dengan pengujian unit pada mesin pengembangan Anda. Overhead pengujian Anda diminimalkan dengan cara ini karena Anda hanya akan menguji pada perangkat keras target Anda saat diperlukan.
Iron Saviour
1
@Benjohn Arduino file sumber sketsa dulu memiliki ekstensi "pde" meskipun itu adalah C ++. arduino.cc/en/Guide/Environment#toc1
Iron Saviour
63

Dengan tidak adanya kerangka kerja unit test yang sudah ada sebelumnya untuk Arduino, saya telah membuat ArduinoUnit . Berikut ini adalah sketsa Arduino sederhana yang menunjukkan penggunaannya:

#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();
}
Matthew Murdoch
sumber
18
Tes tampaknya hanya berjalan di Arduino, sehingga Anda tidak dapat menjalankannya secara otomatis di mesin pengembangan Anda. Gagasan dasar pengujian unit adalah menjalankannya secara otomatis, sehingga desain saat ini tampaknya lebih merupakan alat debugging tetapi tidak ada kerangka kerja pengujian unit nyata.
Jakob
1
Kamu benar. Untuk dapat menjalankannya di PC, di samping itu, membutuhkan emulator Arduino atau AVR. Tidak ada lapisan abstraksi perangkat keras nyata di perpustakaan Arduino (saat ini) dan emulator AVR ketika saya melihat semuanya masih dalam pengembangan. Jika segala sesuatunya berjalan sekarang maka pada prinsipnya ini bisa dilakukan.
Matius Murdoch
12
@ MatthewMurdoch Saya khawatir Anda salah. Menurut definisi, tes unit tidak pernah dijalankan di lingkungan target. Bahkan, ide di balik pengujian unit adalah untuk sepenuhnya menghilangkan lingkungan target dari pengujian. Mereka selalu dijalankan di lingkungan seperti lab yang mengolok-olok semua kegiatan di luar unit yang sedang diuji untuk memastikan bahwa keberhasilan atau kegagalan tes HANYA mencerminkan unit yang sedang diuji. Itulah salah satu alasan terbesar orang menggunakan konsep Inversion of Control dalam proyek yang kompleks.
Iron Savior
2
@ marcv81 Area di mana masalah portabilitas seperti itu sangat mungkin menjadi subjek yang buruk untuk pengujian unit. Ingat bahwa pengujian unit hanya boleh menguji kode ANDA, jadi batasi cakupannya. Dengan perbedaan besar dalam perangkat keras yang kita bicarakan di sini, saya dapat menerima bahwa beberapa keadaan seperti itu mungkin tidak dapat dihindari. Dalam kasus tersebut, seorang insinyur harus tetap sadar dan mengambil langkah-langkah mitigasi. Ini bisa berarti mengubah desain Anda untuk meningkatkan testability atau bahkan sesuatu yang sederhana seperti hanya mendokumentasikan fakta-fakta yang relevan.
Iron Savior
2
@ Iron Savior, unit test menguji kode Anda, tetapi kode Anda berjalan di suatu tempat. Jika konteks itu atau meniru konteks Arduino; maka ArdunoUnit akan membantu Anda menulis unit test. Jika Anda melihat proyek ArduinoUnit, meta-testing kerangka kerja secara otomatis memuat, menjalankan, dan memverifikasi hasil pengujian pada target lintas-platform. Sama seperti yang Anda lakukan pada target lintas platform lainnya. Sudut pandang Anda adalah alasan untuk tidak menguji kode di lingkungan yang disematkan di mana kebenaran sangat penting, jika tidak sering lebih, daripada konteks lainnya.
Warren MacEvoy
21

Saya memiliki unit yang cukup sukses menguji kode PIC saya dengan mengabstraksi akses perangkat keras dan mengejeknya dalam pengujian saya.

Sebagai contoh, saya abstrak PORTA dengan

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

Kemudian SetPortA dapat dengan mudah diejek, tanpa menambahkan kode overhead dalam versi PIC.

Setelah abstraksi perangkat keras telah diuji beberapa saat kemudian saya segera menemukan bahwa umumnya kode beralih dari rig uji ke PIC dan berfungsi pertama kali.

Memperbarui:

Saya menggunakan #include seam untuk kode unit, #include kode unit dalam file C ++ untuk test rig, dan file C untuk kode target.

Sebagai contoh saya ingin multipleks empat 7 segmen tampilan, satu port menggerakkan segmen dan yang kedua memilih tampilan. Kode tampilan berinteraksi dengan display melalui SetSegmentData(char)dan SetDisplay(char). Saya bisa mengejek ini di rig pengujian C ++ saya dan memeriksa apakah saya mendapatkan data yang saya harapkan. Untuk target saya gunakan #definesehingga saya mendapatkan tugas langsung tanpa overhead panggilan fungsi

#define SetSegmentData(x) {PORTA = x;}
David Sykes
sumber
Saya dapat melihat pada prinsipnya bagaimana saya dapat menggunakan 'jahitan' preprocessor untuk pengujian unit. Namun saya tidak yakin bagaimana saya bisa melakukan ini tanpa sebuah emulator yang menjalankan tes atau kompiler kompatibel AVR-gcc yang output (dalam kasus saya) Jendela binari ...
Matthew Murdoch
Terima kasih atas pembaruannya. Apakah Anda menjalankan tes unit pada PIC atau pada PC Anda?
Matius Murdoch
Tes unit dijalankan pada Mac menggunakan Xcode. Untuk menjalankannya di Pic mungkin perlu emulator. Abstrak itu sehingga berjalan pada Mac membuat prosesor beralih banyak easieer besar
David Sykes
Lingkungan Arduino menggunakan kompiler avr-gcc yang memiliki beberapa keanehan yang berarti bahwa kompilasi dengan gcc (atau kompiler C ++ lainnya) dan berjalan pada PC mungkin tidak berarti bahwa kode tersebut juga akan dikompilasi pada avr-gcc.
Matius Murdoch
Perbedaan apa yang Anda bicarakan? Apakah mereka hal-hal yang tidak dapat ditangani dengan arahan preprosesor?
Joseph Lisee
15

Tampaknya emulino akan melakukan pekerjaan dengan sempurna.

Emulino adalah emulator untuk platform Arduino oleh Greg Hewgill. ( Sumber )

Repositori GitHub

Gonzo
sumber
12

simavr adalah simulator AVR yang menggunakan avr-gcc.

Ini sudah mendukung beberapa mikrokontroler ATTiny dan ATMega, dan - menurut penulis - mudah untuk menambahkan lagi.

Dalam contoh terletak simduino, sebuah emulator Arduino. Ini mendukung menjalankan bootloader Arduino dan dapat diprogram dengan avrdude melalui Socat ( Netcat yang dimodifikasi ).

Gonzo
sumber
9

Anda dapat menguji unit dalam Python dengan proyek saya, PySimAVR . Arscons digunakan untuk membangun dan simavr untuk simulasi.

Contoh:

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'

Mulai tes:

$ nosetests pysimavr/examples/test_example.py
pysimavr.examples.test_example.test_atmega88 ... ok
ponty
sumber
6

Saya tidak mengetahui adanya platform yang dapat menguji kode Arduino.

Namun, ada platform Fritzing , yang dapat Anda gunakan untuk memodelkan perangkat keras dan kemudian mengekspor diagram dan barang-barang PCB.

Layak diperiksa.

Yuval Adam
sumber
6

Kami menggunakan papan Arduino untuk akuisisi data dalam percobaan ilmiah besar. Selanjutnya, kami harus mendukung beberapa papan Arduino dengan implementasi yang berbeda. Saya menulis utilitas Python untuk secara dinamis memuat gambar hex Arduino selama pengujian unit. Kode yang ditemukan pada tautan di bawah ini mendukung Windows dan Mac OS X melalui file konfigurasi. Untuk mencari tahu di mana gambar hex Anda ditempatkan oleh Arduino IDE, tekan tombol shift sebelum Anda menekan tombol build (play). Tekan tombol shift sambil menekan unggahan untuk mencari tahu di mana avrdude Anda (utilitas unggah baris perintah) berada di sistem / versi Arduino Anda. Atau, Anda dapat melihat file konfigurasi yang disertakan dan menggunakan lokasi instal Anda (saat ini di Arduino 0020).

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

toddstavish
sumber
+1 Barang bagus! Apakah Anda memiliki informasi tentang bagaimana Anda melakukan pengujian unit Anda setelah gambar diunggah?
Matthew Murdoch
Kami menggunakan nosetests untuk menjalankan tes unit kami di sisi python. Pengaturan untuk setiap tes memuat gambar hex yang benar untuk tes itu. Kami memulai dari yang kecil dan kemudian mengerjakan pengujian yang lebih komprehensif. Pastikan komunikasi serial berfungsi, pastikan integrasi serial ke UI berfungsi, periksa serial ke integrasi DB, dll. Analog_read_speed pde dan py menunjukkan dasar-dasar ini (lihat tautan github di atas). Akhirnya, kami akan membuka sumber seluruh proyek, jadi harap tetap disini. :)
toddstavish
6

Program ini memungkinkan menjalankan beberapa tes unit Arduino secara otomatis. Proses pengujian dimulai pada PC tetapi tes berjalan pada perangkat keras Arduino yang sebenarnya. Satu set unit test biasanya digunakan untuk menguji satu perpustakaan Arduino. (ini

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

Halaman proyek GitHub: http://jeroendoggen.github.com/Arduino-TestSuite

Halaman dalam Indeks Paket Python: http://pypi.python.org/pypi/arduino_testsuite

Tes unit ditulis dengan "Perpustakaan Pengujian Unit Arduino": http://code.google.com/p/arduinounit

Langkah-langkah berikut dilakukan untuk setiap rangkaian unit tes:

  • Baca file konfigurasi untuk mengetahui tes mana yang harus dijalankan
  • Script mengkompilasi dan mengunggah sketsa Arduino yang berisi kode pengujian unit.
  • Tes unit dijalankan di papan Arduino.
  • Hasil tes dicetak melalui port serial dan dianalisis dengan skrip Python.
  • Script memulai tes berikutnya, mengulangi langkah-langkah di atas untuk semua tes yang diminta dalam file konfigurasi.
  • Script mencetak ringkasan yang menunjukkan ikhtisar semua tes gagal / lulus dalam tes lengkap.
jeroendoggen
sumber
5

Simpan kode khusus perangkat keras secara terpisah atau diabstraksi dari yang lain sehingga Anda dapat menguji dan men-debug "istirahat" yang lebih besar itu pada platform apa pun yang memiliki alat bagus dan yang paling Anda kenal.

Pada dasarnya, cobalah untuk membangun sebanyak mungkin kode final dari sebanyak mungkin blok bangunan yang diketahui bekerja. Pekerjaan khusus perangkat keras yang tersisa kemudian akan jauh lebih mudah dan lebih cepat. Anda dapat menyelesaikannya dengan menggunakan emulator yang ada dan / atau meniru perangkat Anda sendiri. Dan kemudian, tentu saja, Anda harus menguji hal yang sebenarnya. Bergantung pada keadaan, itu mungkin atau mungkin tidak dapat diotomasi dengan sangat baik (yaitu siapa atau apa yang akan menekan tombol dan memberikan input lain? Siapa atau apa yang akan mengamati dan menafsirkan berbagai indikator dan output?).

Alexey Frunze
sumber
5

Saya menggunakan Searduino saat menulis kode Arduino. Searduino adalah simulator Arduino dan lingkungan pengembangan (Makefiles, kode C ...) yang membuatnya mudah untuk meretas C / C ++ menggunakan editor favorit Anda. Anda dapat mengimpor sketsa Arduino dan menjalankannya di simulator.

Cuplikan layar Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png

Searduino 0.9 akan dirilis dan sebuah video akan direkam segera setelah tes terakhir selesai .... dalam satu atau dua hari.

Pengujian pada simulator tidak dianggap sebagai tes nyata, tetapi itu pasti telah banyak membantu saya dalam menemukan kesalahan bodoh / logis (lupa untuk melakukan pinMode(xx, OUTPUT) , dll).

BTW: Saya adalah salah satu orang yang mengembangkan Searduino.

pengguna3183814
sumber
5

Saya membangun arduino_ciuntuk tujuan ini. Meskipun terbatas pada pengujian perpustakaan Arduino (dan bukan sketsa mandiri), ini memungkinkan unit test dijalankan secara lokal atau pada sistem CI (seperti Travis CI atau Appveyor).

Pertimbangkan perpustakaan yang sangat sederhana di direktori Perpustakaan Arduino Anda, yang disebut DoSomething, dengan do-something.cpp:

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

int doSomething(void) {
  return 4;
};

Anda akan mengujinya sebagai berikut (dengan file uji dipanggil test/is_four.cppatau semacamnya):

#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.

Itu saja. Jika assertEqualsintaks dan struktur tes itu tampak familier, itu karena saya mengadopsi beberapa perpustakaan ArduinoUnit milik Matthew Murdoch yang dia sebut dalam jawabannya .

Lihat Reference.md untuk informasi lebih lanjut tentang pengujian unit pin I / O, jam, port serial, dll.

Tes unit ini dikompilasi dan dijalankan menggunakan skrip yang terkandung dalam permata ruby. Untuk contoh cara mengaturnya, lihat README.md atau cukup salin dari salah satu contoh ini:

Ian
sumber
Ini terlihat menarik, tapi saya tidak yakin itu benar menguji kode Arduino. Dari output yang Anda posting, kompilasi ke arsitektur x86_64, yang jelas tidak digunakan untuk Arduino. Itu bisa memperkenalkan bug yang disebabkan oleh konflik antara implementasi tipe.
Cerin
Bug semacam itu tentu saja mungkin. Apakah Anda memiliki contoh yang dapat saya gunakan untuk test case?
Ian
3

Ada sebuah proyek bernama ncore , yang menyediakan inti asli untuk Arduino. Dan memungkinkan Anda untuk menulis tes untuk kode Arduino.

Dari deskripsi proyek

Inti asli memungkinkan Anda untuk mengompilasi dan menjalankan sketsa Arduino di PC, umumnya tanpa modifikasi. Ini menyediakan versi asli dari fungsi Arduino standar, dan interepreter baris perintah untuk memberikan input ke sketsa Anda yang biasanya berasal dari perangkat keras itu sendiri.

Juga di bagian "apa yang harus saya gunakan"

Jika Anda ingin membuat tes, Anda perlu cxxtest dari http://cxxtest.tigris.org . NCORE telah diuji dengan cxxtest 3.10.1.

Sudar
sumber
Ini adalah proyek yang menarik. Sayangnya, sepertinya sudah mati, karena tidak ada kemajuan selama 6 tahun.
Cerin
2

Jika Anda ingin kode unit-test di luar MCU (di desktop), lihat libcheck: https://libcheck.github.io/check/

Saya menggunakannya untuk menguji kode tertanam saya sendiri beberapa kali. Kerangka ini cukup kuat.

ezaquarii
sumber
Satu-satunya downside adalah bahwa ini tidak mendukung g ++, yang membuatnya tidak berguna untuk menguji sebagian besar pustaka Arduino yang menggunakan fitur C ++.
Cerin
1

Anda dapat menggunakan emulare - Anda dapat menarik dan melepas mikrokontroler pada diagram dan menjalankan kode Anda di Eclipse. Dokumentasi di situs web memberi tahu Anda cara mengaturnya.

Imre
sumber
1

Gunakan Proteus VSM dengan perpustakaan Arduino untuk men-debug kode Anda atau untuk mengujinya.

Ini adalah praktik terbaik sebelum mendapatkan kode Anda, tetapi pastikan dengan timing karena simulasi tidak berjalan secara realtime saat dijalankan di papan tulis.

sathish
sumber
1

Coba simulator sirkuit Autodesk . Hal ini memungkinkan untuk menguji kode dan sirkuit Arduino dengan banyak komponen perangkat keras lainnya.

Sidhant Goyal
sumber
0

Pada dasarnya Arduino ditulis dengan C dan C ++, bahkan pustaka arduino ditulis dalam C dan C ++. Jadi, secara sederhana hanya menangani kode sebagai C dan C ++ dan mencoba melakukan pengujian unit. Di sini, dengan kata "handle" saya maksud Anda untuk mengubah semua sintaks dasar seperti serial.println ke sysout, pinmode ke varaibles, void loop to while () loop yang memecah baik keystock atau setelah beberapa iterasi.

Saya tahu ini sedikit proses yang panjang dan tidak terlalu mudah. ​​Pada pengalaman pribadi saya, setelah Anda selesai melakukannya, ini berubah menjadi lebih dapat diandalkan.

-Nandha_Frost

Nandha Frost
sumber
0

Jika Anda tertarik untuk menjalankan sketsa INO dan checkout output serial, saya memiliki implementasi yang berfungsi dalam proyek checksum Arduino NMEA saya .

Script berikut mengambil file dan menggunakan Arduino CLI untuk mengkompilasinya ke file HEX yang kemudian dimuat ke SimAVR yang mengevaluasi dan mencetak output serial. Karena semua program Arduino berjalan selamanya tanpa benar-benar memiliki pilihan untuk bunuh diri ( exit(0)tidak berfungsi), saya membiarkan sketsa berjalan selama beberapa detik dan kemudian membedakan output yang ditangkap dengan output yang diharapkan.

Unduh dan ekstrak Arduino CLI (dalam hal ini versi 0.5.0 - terbaru pada saat penulisan):

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

Sekarang Anda dapat memperbarui indeks dan menginstal inti yang sesuai:

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

Dengan asumsi sketsa Anda dinamai nmea-checksum.ino, untuk mendapatkan ELF dan HEX, jalankan:

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

Selanjutnya, SimAVR untuk menjalankan HEX (atau ELF) - Saya membangun dari sumber karena rilis terbaru tidak berfungsi untuk saya:

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

Kompilasi yang berhasil akan memberi Anda simavr/run_avryang dapat Anda gunakan untuk menjalankan sketsa. Seperti yang saya katakan, timeoutjika tidak maka tidak akan pernah berakhir:

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

File yang dihasilkan akan memiliki karakter kontrol kode warna ANSI yang membungkus output serial, untuk menghilangkannya:

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

Sekarang yang perlu Anda lakukan adalah membandingkan file ini dengan file yang dikenal baik:

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

Jika tidak ada perbedaan, diffakan keluar dengan kode 0, jika tidak maka skrip akan gagal.

Tomáš Hübelbauer
sumber