Birim testi yan etki-ağır kod


10

Bir robot çalıştırmak için C ++ kodu yazmaya başlıyorum ve gerçekten yapabiliyorsam, birim testlerini nasıl kullanacağımı bilmiyorum. Robot için otomatik olarak programlanan ve yürütülen "komutlar" oluşturulmasına izin veren bir kütüphane sağlanmıştır. Bu komutlar oluşturmak için mekanizma sağladıkları bir komut temel sınıf alt sınıf ve sanal uygulamaktır void Initialize(), void Execute()ve void End()yöntemleri. Bu işlevler tamamen robota bir şeyler yapan yan etkileri için çalışır (motorları çalıştırın, pistonları uzatın, vb.). Bu nedenle, koda birim testleri eklemek için hiçbir yer görmüyorum, tüm kütüphaneyi alay etmekten kısa, böylece robotun durumundan önce ve sonra sanal olanı kontrol edebiliyorum. Bunu aşırı zor olmayan bir birim test etmenin bir yolu var mı?

Düzenle

Sanırım kütüphanenin işlevselliği konusunda yanıltıcı olabilirim. Kütüphane, robotun arayüzünün çoğunu ve komut / zamanlama sistemini sağlar, bu yüzden komut taban sınıfını alay etmek kadar basit değildir, tüm arayüzü donanıma taklit etmek zorundayım. Maalesef bunu yapacak zamanım yok.


Robotunuzun yaptığı herhangi bir eylemi geri alabileceğinizi düşünüyorum, değil mi? Testinizin eylemlerini geri alamaz mısınız?
Neil

1
Kütüphane miras yerine kompozisyon kullanmadı, çünkü böyle olsaydı komut sınıfıyla alay edebilirsiniz.
Robert Harvey

@Neil Ne istediğini tam olarak bilmiyorum. Sorunuzu yeniden söyleyebilir misiniz?
Kunkel

Yanıtlar:


7

Bu durumda yapacağım şey, gerçek Robot'takilere karşılık gelen yöntemlerle kendi RobotControl arayüzümü tanıtmak olacaktır.

Bunu yaptıktan sonra, bu arayüzü gerçek robot lib'e karşı uygulayan bir RobotControlImpl sınıfı yapacağım.

Sonuç olarak yazacağım komutlar temel sınıfı genişletmez, bunun yerine tanıttığınız arabirimde çalışır.

Bu şekilde RobotControl ile alay edebilir, alaycı herhangi bir komuta geçirebilir ve arayüzde doğru yöntemler olarak adlandırdığını doğrulayabilirsiniz.

Prod'da RobotControl'ün gerçek impl değerini uyguladığınız komutlara geçireceksiniz.

Aklınızda olan ve hantal olarak düşündüğünüzden emin değil misiniz?

Düzenleme: Oh, ve komutları tamamlamak için beklemek için uyku bekliyoruz (kabus, ama bazen bu ne var), ben komutları RobotControl bir uyku yöntemi çağırmak gerekir. Bu şekilde test sırasında uykuyu devre dışı bırakabilir ve komutun uyumaya çalıştığını doğrulayabilirsiniz.


2
+1. Arayüzü beğenmediniz mi? Kendin Yap.
Neil

Kulağa tüm kütüphaneyi alay etmemi önerdiğin anlaşılıyor. Komutların çağıracağı hemen hemen tüm fonksiyonlar kütüphanenin içindedir.
Kunkel

0

Kod minimal invaziv bir şekilde test edilebilir yapmak mümkün olduğunu düşünüyorum. Bununla demek istediğim, komutları tam olarak robot kütüphanesi yazarlarının amaçladığı gibi yazabilirsiniz. Ara katmanınızı kullanmayan başkalarıyla kod değişimi yapmak istiyorsanız bu avantajlı olabilir.

Kodunuz için ayrı bir "birim sınama derlemesi" gerekir.

Yaptığınız şey, bir merkezi başlık dosyasında, bu birimin sınama derlemesi olup olmadığını tanımlamak için derleme zamanını denetlemeniz ve öyleyse, temel sınıfın adını ve belki de robot kitaplığındaki diğer bazı sınıfların sınıf adlarını yeniden tanımlamanızdır. test uygulamanızın Robot lib'dekiyle aynı sanal işlevleri tanımlamanız ve robotta çağırdığınız yöntemler için saplamalar sağlamanız gerekir.

Daha sonra, robot kütüphanesinin yapacağı aynı yöntemleri çağıran kendi test çerçevenize atabileceğiniz komutlarınız var.

Bu bir miktar stubbing ve alay etmeyi içerecektir, ancak bu herhangi bir birim test tasarımında kaçınılmazdır.

Temel sınıf adının değiştirilmesi #define ile veya muhtemelen tercih edilen bir typedef ile yapılabilir.

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.