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.
Jawaban:
Jangan Jalankan Tes Unit pada Perangkat Arduino atau Emulator
Kasing terhadap mikrokontroler Perangkat / Emulator / tes berbasis Sim
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:
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:
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
fake_serial.cpp
dan akhirnya, program tes yang sebenarnya:
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.
sumber
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:
sumber
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
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)
danSetDisplay(char)
. Saya bisa mengejek ini di rig pengujian C ++ saya dan memeriksa apakah saya mendapatkan data yang saya harapkan. Untuk target saya gunakan#define
sehingga saya mendapatkan tugas langsung tanpa overhead panggilan fungsisumber
Tampaknya emulino akan melakukan pekerjaan dengan sempurna.
Repositori GitHub
sumber
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 ).
sumber
Anda dapat menguji unit dalam Python dengan proyek saya, PySimAVR . Arscons digunakan untuk membangun dan simavr untuk simulasi.
Contoh:
Mulai tes:
sumber
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.
sumber
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
sumber
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:
sumber
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?).
sumber
James W. Grenning menulis buku besar dan yang satu ini tentang unit pengujian tertanam C kode Test Driven Development untuk Embedded C .
sumber
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.
sumber
Saya membangun
arduino_ci
untuk 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
, dengando-something.cpp
:Anda akan mengujinya sebagai berikut (dengan file uji dipanggil
test/is_four.cpp
atau semacamnya):Itu saja. Jika
assertEqual
sintaks 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:
sumber
Ada sebuah proyek bernama ncore , yang menyediakan inti asli untuk Arduino. Dan memungkinkan Anda untuk menulis tes untuk kode Arduino.
Dari deskripsi proyek
Juga di bagian "apa yang harus saya gunakan"
sumber
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.
sumber
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.
sumber
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.
sumber
Coba simulator sirkuit Autodesk . Hal ini memungkinkan untuk menguji kode dan sirkuit Arduino dengan banyak komponen perangkat keras lainnya.
sumber
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
sumber
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):
Sekarang Anda dapat memperbarui indeks dan menginstal inti yang sesuai:
Dengan asumsi sketsa Anda dinamai
nmea-checksum.ino
, untuk mendapatkan ELF dan HEX, jalankan:Selanjutnya, SimAVR untuk menjalankan HEX (atau ELF) - Saya membangun dari sumber karena rilis terbaru tidak berfungsi untuk saya:
Kompilasi yang berhasil akan memberi Anda
simavr/run_avr
yang dapat Anda gunakan untuk menjalankan sketsa. Seperti yang saya katakan,timeout
jika tidak maka tidak akan pernah berakhir:File yang dihasilkan akan memiliki karakter kontrol kode warna ANSI yang membungkus output serial, untuk menghilangkannya:
Sekarang yang perlu Anda lakukan adalah membandingkan file ini dengan file yang dikenal baik:
Jika tidak ada perbedaan,
diff
akan keluar dengan kode 0, jika tidak maka skrip akan gagal.sumber