Birim testlerin dikliği ve birim testlerin kısaltılması


14

Bir video oyunu için direksiyon sistemi için birim testleri yazıyorum. Sistemin birkaç davranışı vardır (A nedeni nedeniyle bu alandan kaçının, B nedeni nedeniyle bu alandan kaçının, her biri bir bölge haritasına biraz bağlam ekler.Ayrı bir fonksiyon daha sonra haritayı ayrıştırır ve istenen bir hareketi üretir.

Davranışlar için birim testlerinin nasıl yazılacağına karar vermede sorun yaşıyorum. TDD'nin önerdiği gibi, sadece davranışların istenen hareketi nasıl etkilediğiyle ilgileniyorum. Örneğin, nedenden ötürü kaçının A, kötü pozisyondan uzak bir harekete neden olmalıdır. Davranışın haritaya nasıl veya neden bağlam eklediğini umursamıyorum, sadece istenen hareketin konumdan uzak olması.

Bu nedenle, her davranış için yaptığım testler davranışı ayarladı, haritaya yazmasını sağladı, daha sonra istenen hareketi çözmek için harita ayrıştırma işlevini yürüttü. Eğer bu hareket şartnamemi karşılarsa mutlu olurum.

Ancak şimdi testlerim hem düzgün çalışan davranışlara hem de harita ayrıştırma işlevinin doğru çalışmasına bağlı. Ayrıştırma işlevi başarısız olursa, bir çift yerine yüzlerce başarısız test alırdım. Birçok test yazma kılavuzu bunun kötü bir fikir olduğunu ileri sürmektedir.

Ancak, haritayı alay ederek doğrudan davranışların çıktısına karşı test edersem, o zaman kesinlikle uygulamaya çok sıkı bir şekilde bağlıyım? Haritadan aynı hareketi biraz farklı bir davranış kullanarak alabilirsem, testler yine de geçmelidir.

Şimdi bilişsel uyumsuzluk çekiyorum. Bu testleri yapılandırmanın en iyi yolu nedir?


... sihirli bir cevap olduğundan emin değilim. Temelde kırılabilecek şeyleri test edersiniz. İdeal olarak, bir şekilde sihirli bir şekilde hangi düşük seviyeli testlerin zaten yüksek seviyeli testlerle yeterince kapsanacağını kendi alt seviyeli birim testlerine ihtiyaç duymadıklarını söyleyebileceksiniz. Buna bakmanın başka bir yolu: bir testin başarısız olduğu zamandan bir geliştiricinin sorunu çözdüğü zamana kadar ne kadar zaman geçecek? Bu zamanın düşük olmasını istiyorsunuz. Birimler yapmadıysanız, ancak sadece mükemmel fonksiyonel testler (tam üst düzey kapsama alanı) yaptıysanız, o zaman yine de çok yüksek olurdu. Bunu sezgisel bir rehber olarak kullanmaya çalışın.
Calphool

Yanıtlar:


10

İdeal dünyada, gerçekten de aynı soyutlama seviyesinde bir dizi mükemmel dikey birim testleriniz olur.

Gerçek dünyada, genellikle uygulamanın birçok farklı düzeyinde testleriniz vardır, bu nedenle genellikle daha yüksek seviye testleri, özel düşük seviye testleri ile zaten test edilmiş olan işlevselliği kullanır. (Birçok kişi, birim testleri yerine böyle daha yüksek seviyeli testleri alt sistem / entegrasyon testlerini çağırmayı tercih eder; yine de aynı birim test çerçevesi üzerinde çalışabilirler, bu nedenle teknik açıdan çok fazla fark yoktur.)

Bunun kötü bir şey olduğunu düşünmüyorum. Mesele, kodunuzun projenize ve durumunuza en uygun şekilde test edilmesini sağlamaktır, "ideal yola" bağlı kalmamaktır.


Sanırım yazarın ana noktası, bu üst düzey testler için taslaklar / alaylar veya gerçek uygulamalar kullanmanız gerekip gerekmediğiydi
SiberianGuy

2

Bu tür testler neden alaycıların icat edildiğidir. Ana fikir: Nesneniz için bir alay (harita, davranış, karakter, ...), ardından gerçek nesne yerine o alay kullanarak testler yazarsınız. İnsanlar bazen alaycı dublör derler ve her ikisi için de başka kelimeler olduğunu düşünüyorum.

Sizin durumunuzda, davranışları test etmeniz gerektiğinde harita için bir alay konusu ve haritayı test etmek istediğinizde diğer alaylar için davranışlar yazabilirsiniz. Alaylarınız ideal olarak alay etmekte olduğunuz gerçek davranışlardan çok daha basit olacaktır, sadece bu test için gerçekten ihtiyacınız olan yöntemleri veya değişkenleri içerir. Her test için farklı bir alay yazmanız gerekebilir veya bazı alayları yeniden kullanabilirsiniz. Ne olursa olsun, test için uygun olmalı ve mümkün olduğunca gerçek davranışa benzememelidir.

Bazı harita veya davranış örnekleri eklediyseniz, belki birisi yazabileceğiniz alay örnekleri verebilir. Ben değilim, daha önce hiç Pong'dan daha gelişmiş bir video oyunu programlamamıştım ve o zaman bile bir kitabı izliyordum, ama belki de hem birim testinde hem de oyun geliştirmede çok deneyimli biri.


0

Bence bir birimden çok daha yüksek seviyedeki şeyleri test etmeye çalışıyorsunuz.

Çoğu davranış testi, doğru davranıp davranmadığını söylemek için arkasında biraz zeka gerektirir. Bu, otomatik test kullanılarak kolayca yapılamaz.


bu yüzden kısaltmadan bahsettim. Bir davranıştaki kod satırlarını tek tek test etmek için küçük birim testleri kolayca yazabilirim ve yaptım, ancak harita ayrıştırma işlevinin çıktısını okumaya bağlı. Davranış testlerimin hiçbiri büyük değil, her biri davranışın yalnızca bir işlevselliğini test ediyor.
tenpn
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.