Birim testi prosedür kodu etkili midir?


13

Mevcut bir projede, kodumuza sızmış gibi görünen sabit miktarda hatadan kaçınmak için geliştirme döngümüze birim testi eklemek isteyen güçler. Sorun şu ki, spagetti kodu% 95 prosedürel, hiç birim test yapmadım (birim test ile ilgili tüm tecrübelerim OOP kodu ile oldu)

Kısacası sorum şu anki kod tabanımızla birim testine devam etmek ya da uygulama uygun bir OOP çerçevesine taşınana kadar ertelenmesini önermek akıllıca olur mu?

Not: Bu soruyu dil agnostik olarak biçimlendirmeye çalıştığım halde, söz konusu uygulamanın PHP ve javascript kullandığını belirtmenin, bu durumun bu tür uygulamalarda en çok yaşandığı için bu soruyu cevaplayabilecek daha spesifik cevaplar sağlamaya yardımcı olacağını hissediyorum.


13
Birim testi yeni hataları engellemez, gerilemeleri önler.
Daenyth

2
olası yinelenen eski kod ile çalışırken Var birim test jeneratörler yardım etti? ve bir düzine soru daha. "Legacy unit test" için arama yap
mattnz

4
Senin sorunun kod spagetti / Big Ball Of Mud olduğunu, "prosedürel" değil (iyi prosedür kodu test edilebilir gayet iyi - BTDTGTTS). Sizin be besleyen gücün yerine ediyorum (diğer) test almak ve projeye tam bir profesyonel kalite güvencesi düzenlemek onlar gerçekten "böcek sabit miktarda önlemek için" istiyorum.
sivrisinek

@ l0b0 evet yaptım. Özür dilerim, testi daha net olacak şekilde güncelleyecek
canadiancreed

@mattnz Ya Prosedürel birim testi aradım, ama eski değil. Bu formatta hala yeni bir kod yaratıldığından prosedürel! = Eski olduğunu düşündüm
canadiancreed

Yanıtlar:


14

Birim testi, özellikle daha iyi testler daha hızlı oluşturmaya yardımcı olan sahte nesneler gibi birçok süslü özellik sağladığı için nesnelerle iyi çalışır.

Bununla birlikte , hiçbir şey prosedürel bir kod tabanında birim testi yapılmasını yasaklamaz . OOP'ta, çoğu birim testi, bazı parametreleri onlara ileterek ve bir sonuç ya da belirli bir tipin istisnasını bekleyerek test yöntemleridir. Bu işlem aynı zamanda usul koduyla da yapılabilir; sadece test yöntemleri yerine fonksiyonları test edersiniz .

Aşağıdakileri yapmanız gerektiğini unutmayın:

  • Test etmeniz ve gerekmediğiniz işlevleri izole edin. OOP'de bu kolaydır: özel yöntemlerin test edilmesi gerekmez, çünkü arayanlar bunlara asla doğrudan erişemezler. Muhtemel prosedürel kodunuzda bazı fonksiyonlar bu şekildedir ve testlere gerek yoktur.

  • Küresel kapsamı düşünün . Sorun OOP'de de var, ancak spagetti kodunu test etmeniz gerektiğini söylerseniz, bu kodu yazan kişilerin küresel kapsamı çok fazla kullanmak ve içeride değiştirme $_GETveya $_POSTdiziler gibi çılgın şeyler yapmak gibi kötü alışkanlıklara sahip olma olasılığı vardır. fonksiyonlar.

  • Kod dışındaki fonksiyonlarla ilgilenir. Bu daha karmaşık bir durum ama yine de mümkün. Ya require_oncene olduğunu görmek ve / aracılığıyla çıktı yakalamak içinob_startob_get_clean bir sayfa , ya da test paketinden bir HTTP isteği yapmak ve HTML ayrıştırarak yanıtı analiz. Bu gerçekten bir UI testi değil: burada, bir sayfadaki bir düğmenin solda veya sağda görünmesi veya bir bağlantının büyük kırmızı büyük harflerle mi yoksa küçük mavi harflerle mi olduğu önemli değildir. Önem verdiğiniz şey, DOM aracılığıyla bazı HTML öğelerini bulmak ve içeriklerini beklenen ile karşılaştırmaktır.

  • Yanıt kodlarını test edin . require_onceçıktı tamponlama ile iyi, ama aynı zamanda web uygulaması hataları ile başa çıkmak nasıl test etmek zorunda. Örneğin, bir testin beklenen sonucu 404 Bulunamadı ise, yanıtın ne olduğunu öğrenmek için bir HTTP isteği yapmanız gerekir.


5

uygulama uygun bir OOP çerçevesine geçirilinceye kadar ertelenmesini önermek

Daha sonra değil, başka bir platforma geçmeden önce bazı otomatik testler yapın . Daha sonra değil, geçiş yaparken başka testler ekleyin. Bu testler "entegrasyon testleri" veya birim testleri ise, kendiniz karar vermelisiniz, ancak genellikle her iki tür için de favori xUnit test çerçevenizi kullanabilirsiniz.


5

Birim testine başlamanın en etkili yolu, en sık meydana gelen veya en yüksek maliyet olan hata sınıfını belirlemektir. Ardından bu hataları hedefleyen testler oluşturun.

Bu testlerin nasıl uygulanacağı paradigmalar ve diller arasında farklılık gösterecektir. Birim testi yapma yeteneğinizi etkileyecek en büyük şey, kodun kalitesidir; daha az paradigma kullanılır. Birim testinin bir "birim" kodunu tek başına test etmekle ilgili olduğunu unutmayın. Kodun "birimlerini" izole etme yeteneğinizi etkileyen her şey, testi zorlaştıracaktır.

  • küresel kullanımı
  • yan etkiler
  • sıkıca bağlı kod
  • hatalı bağlanmış kod
  • çok sayıda koşullu
  • kötü tasarlanmış "birimler"

Tüm bunların test zorlukları üzerinde dil paradigmasından daha fazla etkisi olacaktır.


4

Kodunuzun bölümlerini otomatik olarak test edebileceğiniz bir durum olduğunda, birim testi etkili olabilir. Yani, soru prosedür kodu etkili bir şekilde birim test edilebilir değil mi, soru bu kod birim test edilebilir. Bu ne kadar okuduğuna ve ayarladığı duruma bağlıdır. İdeal olarak her ikisinin cevabı sıfırdır, ancak değilse, yine de test edebilirsiniz.

Her zaman olduğu gibi, kodun doğru olduğuna dair güveni, bu güveni kazanmanın maliyetine karşı tartmanız gerekir. Birim testi kazancının bir kısmının bağımlılıkları açıkça tanımladığını ve bu anlamda birim test prosedür kodunun OOP koduna kıyasla daha etkili olduğunu unutmayın.


-4

Usule ilişkin koda karşı gerçek birim testleri yapmanın mümkün olduğunu düşünmüyorum. Asıl sorun, her prosedürün muhtemelen ortadan kaldırılamayacak birçok bağımlılığa sahip olmasıdır. Testler en iyi ihtimalle entegrasyon testleri olacaktır. MS Access'teki VB6 modülleri ve VBA modülleri ile birçok ay önce benzer bir şey yaptım.

Bununla birlikte, test iskelesini en fazla acıya neden olan yöntemlerin etrafına koyabilirseniz, bu değerin olması gerekir, değil mi?


5
-1: Prosedür kodu değil, kötü tasarım ve uygulama problemdir. Tıpkı korkunç OP yazabileceğiniz gibi, büyük prosedür kodu da yazabilirsiniz.
mattnz

@mattnz - Yorumunuzun, test prosedürü kodunun varlığıyla ya da olamamayla ilgili söylediklerimle nasıl ilişkili olduğundan emin değilim.
Rob Gray

7
Prosedür kodu spagetti ile eşit değildir. İyi tasarlanmış, modüler, temiz bir şekilde ayrılmış, yüksek uyum / düşük kuplaj kodunu prosedürel bir şekilde yazmak çok mümkündür.
Marjan Venema

2
İyi bir tasarım, prosedürel olsun olmasın herhangi bir kodda birim test edilebilirliği sağlar.
Doc Brown
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.