Düşük seviyeli bileşenlerde TDD yapmak iyi bir fikir mi?


10

Düşük seviyeli bir sürücü veya işletim sistemi bileşenleri / çekirdekleri yazmayı düşünüyorum.

Osdev.org millet önemli bitleri anlamlı bu şekilde test edilebilir olmadığını düşünüyor ama insanlar farklı düşünce bazı tartışmalar okudum. Etrafa baktım, ancak düşük seviyeli bileşenlerde TDD'nin gerçek hayattan örneklerini bulamadım.

Bu insanların gerçekten yaptığı bir şey mi, yoksa sadece teorik olarak insanların konuştuğu bir şey mi, çünkü pratikte bunu yapmanın iyi bir yolu yok mu?


Sadece MS, çekirdek geliştiricilere uygun "çekirdek alayları" (veya her ne olursa olsun) sağlamışsa, söz konusu uygulama "yaratıcı" olmaz diye düşünüyorum.
mlvljr

Merhaba @Bill - Sorunuzu biraz değiştirdim ve yeniden açmak için oy verdim. Orijinal amacınızdan çok fazla değiştirdiysem, lütfen daha fazla düzenleme yapmaktan veya soruyu geri döndürmekten çekinmeyin :)
Rachel

Benim bakış açımdan aynı şeyi söylüyor
Bill

Yanıtlar:


3

Donanımla etkileşime giriyor veya kontrol ediyorsanız, onsuz test etmek zordur. Donanımı taklit etmeyi deneyebilirsiniz, ancak bu genellikle ilk etapta sürücüyü yazmaktan daha zordur, bu nedenle hatanın sürücünüzde veya emülatörünüzde olup olmadığını bilmeden sarsarsınız.


1
Öyleyse neden öykünücüyü test etmiyorsunuz? ;)
mlvljr

@mlvljr: çünkü emülatörler gerçek değil. gerçek donanımın yerini tutamaz.
Paul Nathan

@mlvljr Orijinal testleri test etmek için oluşturulan test paketlerini kullanarak öykünücüyü gerçek donanıma karşı da sınamanız gerekir ... bekleyin, tekrar neredeyim?
Kendine not -

Yani, vmware ve alikes o zaman test edilemez?
mlvljr

1
@mlvljr: Geçerli bir nokta, ama bence "TDD" alanı dışında kalıyor. Pek çok geliştiricinin yazılabilir, enstrümanlı sistem düzeyinde bir emülatöre erişimi yoktur. Dört kanallı bir kapsama sahip olduğum için kendimi şanslı hissettim!
TMN

3

Ben şahsen (aslında TDD bağlı kalmadan) TDD faydalarının birçoğu elde inanıyorum eğilimindedir, tarafından:

  • Arayanın ve callee kodunun aynı anda yazılması (kesinlikle 24 saatten fazla olmamalıdır).
    • Ve bunu arayüzün tasarımını (nesneler, yöntem çağrıları ve parametreler) etkilemek için kullanın.
  • Karmaşık bir algoritma / kod gerektiren bir bileşen için, daha az verimli olsa bile (veya aptalca veya sadece daha dar bir durumda çalışıyorsa bile) önce daha basit ama doğru bir algoritmayı uygulamayı düşünün.
    • Çok basit bir test yöntemi, her iki algoritmayı çalıştırmak ve sonuçlarını karşılaştırmak olacaktır.
  • Kodun bir bölümünde (herhangi bir yolla) bir hata bulunduğunda, kodun bu kısmı çok daha agresif bir şekilde test edilmeyi hak eder. Bu, TDD'nin gerektirdiğinden daha karmaşık testler yapmak anlamına gelir. ( hataların kümelerde oluştuğu gerekçesine dayanarak )

TDD, hangi işlevi uygulamayı planladığınızı veya kodu uygulayarak hangi gereksinimleri karşılamayı planladığınızı oldukça net bir şekilde anlamanızı gerektiriyor gibi görünmektedir . Bazı durumlarda, sorunun çok az anlaşılması söz konusudur. Bu bir Spike çözümü gerektirirdi. Bu Spike çözümü kapsamında, sorun yönetilebilir bir seviyeye indirildiği için TDD uygulanabilir. Her biri orijinal sorunun bazı yönlerini kapsayan birkaç Spikes bittikten sonra, tam çözüm üzerinde çalışmaya başlanabilir ve bu noktada TDD'nin uygulanması, geliştirilmiş anlayış nedeniyle mümkün olabilir.

Düzenlendi:

Sayfayı daha dikkatli okuduktan sonra,

Çekirdek işlevlerinin çoğunu "testbed" test sürücüsünde test etmek mümkün olsa da, kesinti işleme, işlem gönderme veya bellek yönetimi gibi gerçekten "sulu" şeyler muhtemelen birim test edilemez. --- http://wiki.osdev.org/Unit_Testing adresinden

Çoğu parçanın test edilebilir olduğunu ve bazı parçaların farklı bir test türü gerektirdiğini açıkça söylüyorlar : Stres Testi .


ayrıca önemli parçaların farklı test imho gerektiren parçalar olduğunu ima eder.
Bill

ne harika bir cevap! bazı seviyelerde alkış!
manuelBetancurt

1

Yapmıyorum. Efendimin gömülü kodunda sadece kodu yazıyorum ve zamanımı ne yaptığına (ve yapmadığına) dair akıl yürütüyorum. Zaten benim durumumda yapılabileceğinden emin değilim, test kodunu enjekte etmeden belleğin fiziksel sınırına rahatsız edici bir şekilde yaklaşıyorum.

Yeterince büyük sistemler için (yani KB değil, MB bellek var), yeterli zaman ve çaba varsa bazı bileşenler için yapılabilir düşünüyorum. Pimleri yukarı atarak pim okuma kodunu test etmek ... er ... çok anlamlı değil. Mantığınızı yeterince ayırdıysanız, mantığı başka bir yerde test edebilirsiniz.

FWIW, genel durumda TDD satın almıyorum - yeterli belirleyici davranışa sahip yeterli kaynaklara sahip yeterince büyük sistem yığınları için iyi çalışıyor, bunun dışında makul bir uygulama gibi görünmüyor.

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.