Her şeyi test etmem gerekir mi?


28

İlk gerçek projeme Ruby on Rails'de başlayacağım ve kendimi TDD testleri yazmaya zorluyorum . Test yazmada gerçek avantajlar görmüyorum, ancak çok önemli göründüğü için deneyeceğim.

Statik sayfalar dahil, başvurumun her bölümünü test etmek gerekli midir?


9
Bu gerçekten raylar meselesinde bir yakut değil. daha çok TDD sorusu.
Jon Strayer

4
@ JonStrayer: Öyle mi? Cevabın RoR için .NET ile aynı olacağından emin misiniz? Tasarım gereği RoR'nin test maliyetini kasıtlı olarak düşürdüğünü, derleyici biçiminde tip güvenliğine sahip olmamanın testin yararını büyük ölçüde artırdığını öne süreceğim.
pdr

1
Nedense bu soru Kaptan Nero'nun "TEST HER ŞEY TEST !!!" diye bağırdığı bir resim makrosu göndermek istememi sağlıyor.
Mason Wheeler

3
Test yazarken ve onları kör inançtan yazmanın asıl avantajını görmemek doğru gelmiyor. Test yazmadan devam edin, bir süre sonra beklenmedik bir gerileme yaşar ve neden test ettiğinizi bilirsiniz.
ZJR

1
Kodunuzu yeniden yapılandırmaya karar verene kadar bekleyin. Ne zaman büyük değişiklikler yapılsa, işlevselliği doğrulamanız gerekir. Testler olmadan uygulamanızı gözden geçirmeniz ve tüm işlevselliği manuel olarak test etmeniz gerekir. Başka bir büyük güncelleme tanıtın ve tekrar yapmanız gerekecek. Birim testleri, her şeyin beklendiği gibi çalıştığından emin olmanın sadece 'ucuz' bir yoludur.
Evan Plaice

Yanıtlar:


47

TDD test ile ilgili değil, tasarımla ilgili. Testleri yazmak sizi sınıfın nasıl çalışması gerektiğini ve ne tür bir arayüze ihtiyacınız olduğunu düşünmeye zorlar. Testler, daha sonra yeniden ateşlenmeyi kolaylaştıran mutlu bir yan etkidir.

Öyleyse, bunu göz önünde bulundurarak statik bir sayfanın davranışı ve arayüz nedir?

İlk cevabım "none" ve "none" olacaktı.


statik sayfalar için test yok mu?
Matteo Pagliazzi

TDD, bir dereceye kadar tasarımla ilgilidir. Ama yine de bir mimariye ihtiyacın var. Akılda bir mimari olmadan, bir grup testten nasıl organik olarak büyüyeceğini hayal etmek zor.
Robert Harvey,

@MatteoPagliazzi Statik sayfaların erişilebilir olduğunu onaylamak için test seviyesine bağlı olarak (birim testleri / entegrasyon testleri / vb.), Belki bir veya iki tane. Ancak bu birim testleri için çok yüksek.
Izkata

1
@RobertHarvey Hiçbir şey test etme demedim. Statik sayfaları test etme demiştim.
Jon Strayer

@JonStrayer: TDD'ciler TDD'yi tasarım için bazı sihirli iksirler olarak tutma eğilimindedir; Kastettiğin bu değilse özür dilerim. :)
Robert Harvey,

32

Her zaman bir maliyet-fayda analizi. Özelliğin size kırma maliyeti nedir? Maliyet yüksekse, iyi ve iyice test edin. Maliyet düşükse, hafifçe test edin veya hiç test edin.

Ayrıca piyasaya sürülecek zamanın maliyeti de var. Belki de çoğunlukla çalışan bir özellik sunmak, tamamen çalışan bir özellik sunmaktan geç kalmaktan daha iyidir.

Bu soruları genel IMO'da cevaplamak neredeyse imkansız.

Bazı özelliklerin aslında sizin anladığınızdan daha önemli olduğu ortaya çıkması durumunda test etme yeteneğini korumanın daha önemli olduğunu düşünüyorum.


Ayrıca, statik bir sayfadaki hataların mantık hatalarından, tasarım hatalarından ve TDD'nin normalde önlemek için kullanıldığı şeylerin türünden daha kolay düzeltilebileceğini varsayardım. Statik sayfaların hatalarının keşfedilmesi ve düzeltilmesi büyük olasılıkla kolay olacaktır ve benim TDD'nin istenenden daha uzun sürdüğü her iki işlemi de kısaltmak için kullanıldığı izlenimini uyandırıyorum. : D
Gordon Gustafson

Bunu varsaymıyorum. Gizli tarayıcı sürüm davranışları ya da garip javascript bellek sorunları ile daha önce uğraştıysanız, muhtemelen bir antrenman yapmışsınızdır. Daha bazen arka uç dilleri biraz daha güvenilir ve standart olabilir. ara sıra. Belki de html'de olduğu gibi statikten bahsediyorsunuzdur ama javascript de yok.
Michael Durrant,

8

Evet derim". En basit özellikleri ve kodu bile kapsayan testleriniz varsa, yeni kod eklemenin yerinde kodun çalışmamasına neden olmadığından emin olabilirsiniz. Benzer şekilde, karşılaştığınız her hata için bir test yapmak, gerilemelerin geri kaymasını engeller.


"o zaman yeni kod eklemenin yerinde kodun çalışmamasına neden olmadığından emin olabilirsiniz" bu şekilde daha önce yazdığım herhangi bir kod parçasına dokunmamalıyım ve yeni yöntemler ekleyeyim mi?
Matteo Pagliazzi

Hayır, hayır. Ancak, şu anda "çalışan" kod arasındaki öngörülemeyen ve plansız bağımlılıklar, bu bağımlılıkları değiştiren yeni bir kod eklerseniz sorunlara yol açabilir. Ayrıca, testi yanlış yaparsanız, bence oldukça yaygındır, testin kendisini değiştirmeniz ve ardından belki de testten kaynaklanan kodu değiştirmeniz gerekir.
Bruce Ediger

@Andy Bu tamamen saçmalık. Özellik belirleyicileri ve alıcıların test edilmesi hem önemsiz hem de VITAL'dir. Çalışmazlarsa, genellikle bütün sınıf dağılır. Örneğin, çok iş parçacıklı bir uygulamada, kümenin eşzamanlı alımları engellememesi durumunda, veri kaynağı doğru olacağından, bunun sonucu olarak saatlerce sürebilen bozuk bir veri sorunu alırsınız, ancak sonuç ayarlamayacaksanız güncelleme saatini de güncelleyemezse, verilerinizi senkronize etmek imkansız hale gelir. Eğer setterler ve alıcılar gerçekten önemsiz
olsaydı

@deworde Korkarım ki örnek üyelerin güvenli olmasını sağlamak o kadar da yaygın değil. Güvenli olmayan bir türe erişimi denetlemek, bunları güvenli bir şekilde güvenli hale getirmeye çalışmaktan daha olağandır. Her neyse, ne test edeceğimiz, başka bir cevabın belirttiği gibi, maliyet açısından faydalı bir şeydir. Alıcılar veya belirleyiciler için testler yazmak için zaman harcayabilir veya sisteminizin kapsüle etmesi gereken gerçek davranışı test edebilirsiniz.
Andy,

3

Evet, her şeyi test etmelisin ...

Her şey için otomatik testler yazmanıza gerek kalmayacak. Statik sayfalarınız için, işlerin doğru olduğundan emin olmak için Selenium http://seleniumhq.org/ adresini kullanın.

Deneyimlerime göre, bazı ön uç şeyler için test senaryoları yazmak imkansızdır ancak bu nedenle Mark 1 göz küresi kullanarak test etmek isteyebilirsiniz.


Katılmıyorum. Bunu sahte veya veri yoluyla iletemezseniz, neden kodunuzda olsun? Alıcılar ve ayarlayıcılar kendi testlerine ihtiyaç duymazlar, beklenen işlevselliği doğrulamak için sistemin diğer birim testleri ile test edilirler.
Schleis

Elbette, ayarlayıcılar / alıcılar diğer testlerle dolaylı olarak test edilir, ancak birisi "her şeyi test et" derken, bu tür şeyler için özel olarak testler oluşturduklarını sanıyorum. İnsanlara her zaman "önemli şeyleri test et" derim. Setçiler ve alıcılar gibi şeyler benim için bu tanıma uymuyor.
Andy,

2

Test, kodlama kadar önemlidir. "Bir şeyler ters gidebilirse, olur" demeyi duymalısınız. INMO, Kaliteyi arttırmak için kullanılan birçok yazılım mühendisliği tekniğinden Test, erken sorunları bulmanıza yardımcı olmak için en değerli olanıdır.

Her şeyi test etmek mümkün olmamakla birlikte (özellikle küçük ekiplerde ve büyük sistemlerde), testi tamamen atladığınız anlamına gelmez. Test buna değer mi? Wiki-SoftwareTesting bölümüne bakınız .


2

TDD Testleri, eğer böyle yazılırsa, canlı özellikler olabilir. Test yöntemlerinin isimleri bir iş kullanıcısı için anlam ifade etmelidir.


2

Diğerlerinin de belirttiği gibi, Ruby on Rails testinde, (çoğu) diğer dillerden çok daha önemlidir. Bu derleyici eksikliğinden kaynaklanmaktadır.

Gibi diller Delphi , C ++, VB.NET vb ... dilleri derlenmektedir ve sizin derleyici böyle bir yönteme çağrılarda yazım hataları mistkes bir sürü alacak. Ruby on Rails'de yalnızca kodunuzda bir yazım hatası veya bir hata olup olmadığını, belirli bir kod satırı çalıştırıldığında veya görsel uyarıları gösteren bir IDE kullanıp kullanmadığınızı bilirsiniz.

HER tek kod satırı önemli olduğundan (aksi takdirde orada olmaz) yazdığınız her yöntemi denemeniz gerekir. Bazı temel TBDD araçlarını takip ederseniz, bu seslerden çok daha basittir.

Ryan Bates'in bulundu Cast Raylar üzerinde nasıl testine bana çok değerli ve doğru yapılırsa gerçekten TBDD sadeliği vurguladı.


1

Eğer gerçekten TDD metodolojisini kullanıyorsanız, önce geçmeye çalıştığınız bir birim testine girmeden kod yazmazsınız.


2
evet ... ama örneğin statik bir sayfada ne test etmeliyim? onun varlığı? içerik ve linkler var mı? belki yanılıyorum ama zaman kaybı gibi görünüyor ...
Matteo Pagliazzi

1
TDD metodolojisinin mantığınıza uygulandığını düşünüyorum. Statik sayfanız bir html dosyası mı? Hiç değişmeyen bir MVC görüntüsü? İkinci durumda, denetleyicinizin doğru görünümü döndürdüğünü test edebilirsiniz. Bence en önemli şey
TDD'nin

Sanırım, çerçevenin bir bileşeni ile statik bir sayfa sunduğunuzu varsayıyorum. Yöntemlerinizden hiçbiri bu sayfaya dokunmuyorsa, aslında test edilecek bir şey yoktur. Ayrıca Rails'i test etmeniz gerekmez. Sanırım birileri bunu kapsıyor.
Erik

0

TDD ile başlamadığımı söyleyebilirim. Genel olarak mimarlık stratejilerini öğrenmek için daha fazla zaman harcadığınızda bilinçli bir karar verin. TDD, inanmaya başlasanız da bu ödevi atlamanıza izin vermeyecektir.

İşte benim onunla sorunum. Hiç bir zaman kırılmayacak şeyler üzerinde çok fazla boşa harcanan zaman gibi göründüğünüzde TDDers, büyük bir bağımlılık zincirinde beklemeyeceğiniz bir şey yakalandığında takdir edeceğinizi söylüyor. Uygulamanızı yazmadan önce bu tür şeyleri tahmin etmenin imkansız olduğunu belirttiğinizde, ki bu neden ... biz test ediyoruz, testler kullanışlı olsa bile, tasarım konusunda gerçekten daha fazla olduğunu söylüyorlar.

Ama tahmin edilemez bağlantılı bağımlılıkların dev zincirleri berbat tasarımın ürünü değil mi?

Peki hangisi?

İşte bir düşünce. Nesneye yönelik tasarımın aşağıdaki iki ilkesini Tasarım Modellerinden göz önünde bulundurarak ilk etapta devasa karmaşık bağımlılık zincirlerine sahip olamayalım:

"Arayüz program, bir uygulama değil"

Yani nesneleriniz kimin aradığını veya nasıl yapıldığını önemsememelidir. Yalnızca uygun sınırların beslendiğini ve diğer nesnelerden çağırdıkları yöntemlerin beklendiği şekilde çalışmaya yönlendirildiklerini. Çoğu durumda bağımlılık zinciriniz tek bir bağlantı noktasında, yöntem arayanın bir bölümünü çağırır ve yolların kendi yönteminize düştüğü nokta olmalıdır. Olayları kapattığınızda, hata ayıklamak için yararlı mesajlar gönderdiğiniz ve doğruladığınız ve gönderdiğiniz yer burasıdır.

Ve:

"Sınıf kalıtımı üzerinden nesne kompozisyonunu favorilik"

Kim aptal? Katlanmış kasırga miras programında bir sınıfa bir şeyler yapan adam, saçak kasası kırılmasıyla sonuçlanan 30 sınıftan mı oluşuyor, yoksa ilk önce o mimariyle gelen mi? TDD, Pisa sınıfı kulenin içindeki sorunların dibine varamayacağınız kadar erken ulaşmanıza yardımcı olabilir, ancak bu kod felaketinin son noktalarından birini değiştirmeyi denemeyi daha az acı verici hale getirir mi?

Ve beni rahatsız eden şeyin olduğu yer orası. TDD gerçekten tasarıma yardımcı oluyor mu, yoksa kötü mimariyi mümkün kılıyor mu? Bana göre kendi kendine yeten bir strateji olma potansiyeli var gibi görünüyor. Ekibiniz zayıf mimari için ne kadar fazla sorumluluğa sahip olmak zorunda değilse, bu granüler test bileşenlerinin kullanımı o kadar yararlı olur, ancak sonuçta uygulamanız birlikte çalışmak için gittikçe daha büyük bir PITA olur. yer). Bunun sonucunu anlamadaki başarısızlık eller aşağı, zaman içinde iyileştirilmesi ve değiştirilmesi gereken bir uygulama üzerinde çalışırken her zaman yapabileceğiniz en pahalı hatadır.


-1

Soruyu cevaplamak için "burada neyin yanlış gidebileceğini" düşünün. Özellikle, "kod" u değiştirirseniz (biçimlendirme / ne olursa olsun), sayfayı kırmadığınıza nasıl güvenirsiniz? Statik bir sayfa için:

  • renderlemeyebilir
  • yanlış yapabilir
  • JS yüklenmeyebilir
  • resimlerin yolları çalışmayabilir
  • bağlantılar kopmuş olabilir

Şahsen ben tavsiye ederim:

  • Sayfada beklediğiniz bir dizgiyi kontrol eden bir selenyum [1] testi yazınız (mümkünse en alta yakın). Bu, işlediğini doğrular.
  • JS hataları olmadığını kontrol edin (selenyum buna izin veriyor bence)
  • statik sayfaları bir html doğrulayıcısı ve mümkünse bir bağlantı denetleyicisi üzerinden çalıştırın.
  • JS'yi doğrulamayı sevdiğim bir araç bulamadım, ancak jslint veya jshint ile başarı bulabilirsiniz.

Buradaki alıp götürmek, tekrarlanabilir, kullanımı kolay ve test çalıştırıcınızda otomatik olarak çalışacak bir şey istemenizdir.


-1

Sadece tüm mükemmel cevapları eklemek için, işte neyi test edeceğimi ve neyi test etmeyeceğimi düşünüyorum:

Test yapmak:

  • iş mantığı
  • uygulama mantığı
  • işlevselliği
  • davranışı,
  • yani, her şey, gerçekten, hariç :

Test etmeyin:

  • sabitleri
  • sunum

Yani şunu söyleyen bir test yapmanın anlamı yok:

assert wibble = 3

ve yazan bazı kodlar

wibble = 3

Üstelik, sunumda kullanılan şeyleri test etmenin de bir anlamı yok, mesela simgenin mavi renkte olup olmadığı, başlıklar için hangi yazı tipini kullandığınızı vb.

Dolayısıyla, “statik sayfaları test etmeli miyim?” Diye soruyorsunuz ve cevabı şudur: onları sitenizin işlevselliğinin, iş mantığının veya davranışının bir parçası olduğu sürece test edersiniz.

Bu nedenle, uygulamamızda, şartlar ve koşulların sitenin her yerinden (anonim kullanıcılar için, giriş yapan kullanıcılar için, kontrol panelinden, uygulama ekranları vb.) Kullanılabilir olduğunu kontrol eden bir testimiz var. Her sayfada "şartlar ve koşullar" adında bir bağlantı, bağlantının çalıştığını ve sonra testin sayfada göründüğü zaman, Ts & C'lerin "gibi göründüğünü" söyleyin; "bir sabiti sınama" veya "sunumu sınama" olmadan ... böylece metnin doğru olduğunu kontrol edebilirsiniz; örneğin, belirli bir yazı tipi boyutunu veya metin düzenini kontrol etmeden ...

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.