Robotlar (ve diğer mekanik cihazlar) için birim testleri nasıl yazarım?


22

Lise robotik kulübünün bir üyesiyim ve robotun programlanmasından sorumluyum. Çeşitli yetişkinlerden duymaya devam ettiğim bir öneri kodumu doğrulamak için birim testleri yazmam gerektiğidir. Kod tabanı biraz büyüyor ve birim testlerinin böcekleri daha hızlı yakalamama yardım etmekte gerçekten yardımcı olacağını kabul ediyorum.

Ancak, bunu nasıl başarabileceğimden tam olarak emin değilim. Bildiğim kadarıyla, birim test, bir fonksiyon (veya kodun bir alt sistemi) alarak ve her seferinde aynı çıktıyla çıkmasını sağlamak için bir girdi seti besleyerek yapılır. Şu anda sahip olduğum kod ağır veri parçalama işlemi yapmıyor, bunun yerine robot üzerindeki donanım bileşenlerini doğrudan kontrol ediyor. Karmaşıklıkların çoğu, elektroniğin sağlam olduğundan, şu anda kodun robottaki asıl donanıma, vb. Eşleştiğinden emin olmaktan geliyor. Sık sık, yalnızca kodu robota yükleyerek bir sorun olup olmadığını görebilirim. ve onu çalıştırmaya çalışmak.

Ek olarak, herhangi bir mekanik cihazı çalıştırmak için kullanılan kod için birim testleri nasıl yazılabilir? Bana öyle geliyor ki, sadece makinenin çalışmasını fiziksel olarak gözlemleyerek hataları yakalayabilirsiniz.

Yoksa sadece birim testlerinin nasıl çalışması gerektiğini yanlış anlıyor muyum?

( Önemliyse, kod burada , C ++ dilinde yazılmıştır ve FRC'ye katılıyorum )

Yanıtlar:


21

Bu testi yapmak için donanım katmanıyla dalga geçmeniz gerekecektir . Buradaki fikir, kodunuz yerine gerçek donanımla konuşmak yerine, denetleyebileceğiniz donanımın sahte sürümüyle konuşmanız ve ardından kodunuzun doğru çalıştığını doğrulamaktır.

Ne yazık ki üstesinden gelmeniz gereken bazı problemler var:

  • Göreceli olarak düşük seviyeli dillerde şeyleri alay etmek daha zordur (ve bu nedenle çok daha fazla iş)
  • Donanım düzeyinde işlerle dalga geçmek daha zordur (ve bu nedenle çok daha fazla iş)

Ayrıca, otomatikleştirilmiş birim testinin değerinin çoğu, orijinal kodu yazdıktan sonra uzun bir süre boyunca regresyon hatalarını yakalamak için testlerinizi istediğiniz zaman çalıştırabilmenizden gelir. Bu tür yarışmalarda, kodunuz yarışma bittikten sonra hiç kullanılmayacak, bu nedenle testlerin karşılığını gerçekten alamayacaksınız. Özel durumunuza testler eklemenin ne kadar zor olacağını göz önünde bulundurarak, yalnızca manuel testler yapmak ve yarışmanın özelliklerine odaklanmak zamanınızı daha iyi kullanabilir.


1
Güzel cevap Özellikle, kodun yarışmadan sonra kullanılmayacağı ve otomatik birim testlerinin büyük faydasının, testlerin yazıldığı andan itibaren iyi olduğu gerçeği. Kendinizi aynı testi tekrar tekrar çalıştırırken bulmanız durumunda bazı testlerinizi otomatikleştirmeyi düşünebilirsiniz; ama bu olana kadar, fazla mesele yok.
Dawood, Monica

Donanımı hiçbir şekilde takmanıza gerek yok. Robotun kaydı varsa, test programını çalıştırın ve kayıtları takip edin. Son testte, kütükte "sola dön" gözleminin yapılması, robotun sola dönmesiyle eşleşmesi gerekir. Giriş cihazlarıyla alay etmek için bir test donanımı yazmanız gerekecek - giriş cihaz kodunu donanım katmanına mümkün olduğunca yakın
asın

4
@DavidWallace Düşünce için küçük bir yemek olarak, TDD / BDD kullanırken, birim testinin faydaları hemen ortaya çıkar. Birincisi, kodun derhal güvenle yeniden onaylanmasına izin vererek ve ikincisi uygulamanın, testleri yerine getirmek için gereken minimum uygulama ile sınırlı kalmasını teşvik ederek.
S.Robins

4
@ Mattnz kötü fikir ve ben deneyimden biliyorum. Test altındaki kod çok zor bir şekilde başarısız olursa ve robotarm duvara çarpıyorsa, bir parça xxxx $ donanımını mahvederse?
stijn

2
@ matttnz: Robotlarımız yaklaşık 2 feet 3 x 4 feet ve yaklaşık 150 kilo ağırlığında. Kit / tescil her yıl 5 bin dolara mal oluyor ve ek parçalar satın almak için genellikle 5-10 bin dolar daha harcıyoruz. En kötü senaryo muhtemelen 10
dolardan fazlaya

10

Dikkate almanız gereken birkaç şey düşünebilirim. Birincisi, donanım erişim katmanınızı olabildiğince ince kılmaktır, bunun için basit bir sarmalayıcı türü oluşturabilirsiniz. Bu size birkaç avantaj sunar. Birincisi, kodunuzun donanıma özgü davranışlarını donanıma erişimin kendisinden yalıtmanıza izin vermesidir; bu, donanıma erişmenize gerek kalmadan her şeyi donanıma yazmanın en altına kadar test edebileceğiniz anlamına gelir.

Örneğin, bir I2C tabanlı sinyal protokolü tasarlamanız gerekirse, donanımınızı testlerinize bağlamak zorunda kalmadan kodunuzu doğru I2C sinyalleri oluşturduğunu test edebilirsiniz.

Gerçek donanıma yapılan çağrılar için, donanım katmanınızı alay ederek doğru davrandıklarını test edebilirsiniz ve burası çok ince bir donanım katmanının gerçekten işe yaramadığı yerdir, çünkü alayınızı sadece gereken minimum işlevleri yerine getirme ihtiyacını azaltabilirsiniz. gerçekte donanıma hitap eder, ancak tüm sinyallerinizin daha yüksek bir seviyede test edilebilir olması gerektiğinden, bireysel sinyalleri kendileri test etmeniz gerekmez. Bu, sinyallerinizi donanıma göndermeye neden olan belirli donanım yöntemleriyle yapılan aramaları kontrol etmek için sahte cihazınızı kullandığınız anlamına gelir. Donanımınızı yoklamanız gerekiyorsa, sahte cihazınızın yalnızca kodunuzdaki olayları veya yöntemleri tetikleyebilmesi gerekir, çünkü yine, dönüş sinyalinizin daha yüksek bir katmana taşınması gerekir.

Bu temelde Oleksi onun söylediklerinden uyan cevap o sahte donanım düzey şeyler genellikle daha iştir ki sizin için yapabilir leanest mümkün minimal kodu / çağrı katmana tutarsan ancak o kadar zor değil, donanım.

Tüm testleri geçen bir kodunuz olduğunda, donanım katmanınızdaki her şeyi doğru şekilde aldığınızdan emin olmak için yine bir dizi manuel test yapmanız gerekir.

Alay etmekten ve katmanlaşmadan başka akla gelen bir diğer şey, bir test-ilk geliştirme uygulamasını kullanmaktır. Temel olarak gereksinimlerinizi test kriterleri olarak kodlarsınız ve uygulamanızı testlerinize dayandırırsınız. Bu, tüm test durumlarınızın geliştirme çabalarınızı yönlendirmesini sağlarken uygulama kodunuzu minimumda tutmanızı sağlar. Diğer "kritik" olmayan kodlara çok fazla zaman kaybetmeyerek "sadece" yapmaya istekli olabileceğiniz için, test ilk önce odaklanmanıza yardımcı olur ve kullandığınız gibi hata ayıklama sırasında kodunuzu değiştirmeyi kolaylaştıracak senin birim testleri ve alay. Donanımda hata ayıklama yazılımı hatalara yol açacak şekilde karmaşık değildir ve diğer işlere daha iyi harcayacağınız zamanınızın büyük bölümünü emer.


2

Uçuş Simülatörleri'nde nasıl yaptıklarını söyleyebilirim.

Öncelikle, bu soruyu sadece programcılara sorarsanız, cevabın yarısını alırsınız, bu nedenle muhtemelen http://electronics.stackexchange.com adresinde bu yazıyı geçmelisiniz .

Robotlarla hiçbir iş yapmadım ama 5 yıl boyunca uçuş simülatörleri üzerinde donanım yaparak harcadım, böylece mimarisinin nasıl çalıştığını söyleyebilirim.

Donanım katmanı aptal

Basit giriş / çıkış değerlerini ayarlayabileceğiniz ve analog sinyaller için enterpolasyon sınır değerlerini ayarlayabileceğiniz temel bir arayüz içerir. 'Taze' donanımla çalışırken, her şey çok az kalibrasyonla veya kalibrasyonla beklendiği gibi çalışır, ancak zamanla parçalar mekanik olarak aşınır ve ayarlanması gerekir.

Kalibrasyon, min / maks değerleri arasında değişen kesit içeren basit bir tablodur. Bunlar üzerindeki girişi ölçmek için tipik olarak bir servo kullanılır (örneğin doğrusal bir potansiyometre, dönüştürücü, ivmeölçerler, vb.). Veya enstrümantasyon durumunda, doğruluğu görsel olarak değerlendirir ve kalibre edilene kadar ayarlarsınız.

Yazılım katmanı tam tersidir

Her şey karmaşık ve birbirine bağlıdır, bu nedenle işlevselliği test etmek için bazı değişkenleri izole etmek önemlidir. Senaryoları düşünerek başınızı ağrıtmaya gerek yok çünkü veri toplayabileceğiniz bazı gerçekçi senaryolar çalıştırmak çok daha kolay. Testleri yaptığınızda, temelde kayıtlı verileri mevcut çıktıya karşı ölçersiniz.

Bir uçuş simülatöründe buna QTG (Kalifikasyon Test Rehberi) denir. Çekirdeğinde, verileri bir boyutun zaman, diğerinin çıktı olduğu 2B ızgara üzerinde çizer.

İster inanın ister inanmayın, modelleri nasıl geliştirdiklerinin özü budur. Gerçek bir uçak bir ton algılayıcı ile donatılmıştır ve kontrollü senaryolar yapmak için etrafta dolaşmaktadır. Kontrollerin tümü insan etkileşimi olmadan sürülebildiğinden, testler bilgisayar tarafından gerçekleştirilir (yani sim kendisi kendi kendine uçar) ve veriler karşılaştırılır.

Robotikler çok farklı bir ölçekte yaratılsa da, prensipler aynıdır. Geleneksel yaklaşım, donanım ve yazılım katmanlarını tamamen kesmektir, böylece her ikisi de ayrı ayrı test edilebilir. Donanım girişi servolar aracılığıyla toplanır ve bağımsız bir arayüz aracılığıyla ayarlanır. Yazılım girişi, aksi takdirde donanıma gidecek olan sinyalin bağımsız olarak ölçülmesi ve karşılaştırılması ve bilinen 'iyi' verilere göre işaretlenmesi ile ayarlanabilir.

Testlerin kendilerinin mutlaka sonuçların öngörülebilir, ölçülebilir ve tekrarlanabilir olduğu sürece karmaşık olmaları gerekmez.


1

Daha önce de belirtildiği gibi, donanım parçalarını alay ve saplayın. Örnek olarak, robota bir arayüzünüz varsa, bu arayüzden devralabilir ve daha sonra basit saplama uygulamaları yapabilirsiniz. Ardından saplama uygulamasının beklendiği gibi çağrıldığını test edebilirsiniz. Bu beklenen fonksiyonlar veya beklenen parametreler ise.

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.