Programcılar test ediciler kötü mü?


36

Bunun çoktan sorulan diğer sorular gibi göründüğünü biliyorum, ama aslında biraz farklı. Genellikle programcıların bir uygulamayı test etme rolünü yerine getirmede iyi olmadığı düşünülmektedir. Örneğin:

Joel on Software - Test Olmadığın İlk Beş (Yanlış) Neden (benimki vurgusu)

Üniversite CS mezunlarına sizin için çalışabileceklerini söylemeyi denemeyi bile düşünmeyin, ama “herkes QA'da bir süre bir kod yapmak zorundadır”. Bunu çok gördüm. Programcılar iyi testler yapmazlar ve yerine koymak çok daha zor olan iyi bir programcı kaybedersiniz.

Ve bu soruda en popüler cevaplardan biri şöyle diyor (yine vurgum):

Geliştiriciler test edici olabilirler, ancak test edici olmamalıdırlar. Geliştiriciler, istemeden / bilinçsizce, uygulamayı kırabilecek şekilde kullanmaktan kaçınırlar. Çünkü yazdılar ve çoğunlukla kullanılması gerektiği gibi test ettiler.

Yani soru programcılar testte kötü mü? Bu sonucu desteklemek için hangi kanıtlar veya argümanlar var? Programcılar sadece kendi kodlarını test etmede kötü mü? Programcıların test konusunda gerçekten iyi olduklarını gösteren herhangi bir kanıt var mı ?

"Test" ile ne demek istiyorum? Yapmam değil ortalama birim testi veya yazma yazılımına yazılım ekibi tarafından kullanılan metodoloji parçası olarak kabul edilir bir şey. Demek istediğim, kod yapıldıktan ve yazılım ekibinin "test ortamı" olarak adlandırdığı her şey için konuşlandırıldıktan sonra kullanılan bir tür kalite güvence yöntemi.


17
@ jshowter Programlayıcılar kendi kodlarını test ederken en kötüsü, diğerleri kodu test ederken mükemmeldir. Test cihazları (iyi test cihazları), çok fazla kod yazmamaları haricinde, kendi programcılarıdır (çünkü programlama mantığını ve işlevselliğini anlamaları gerekir). Bunun psikoloji ile ilgili bir şey olduğuna inanıyorum, çünkü her zaman kendi işimde şüpheleri bulmakta tereddütlü olduğum için her ne kadar kötü olsa da.
Ubermensch

6
@ Ubermensch, geliştiricilerin varsayılan olarak başkalarının kodlarının mükemmel test edicileri olmalarına katılmıyorum. Bazı geliştiriciler, bir süredir test uygulamasından kaynaklanmaktadır. Genel olarak geliştiriciler için açık olmayan farklı bir zihniyet ve farklı bir motivasyona da ihtiyaç var. Pek çok geliştirici, kodlama bölümüne odaklanma - ve en çok zevk alma - eğilimindedir ve tüm SDLC içindeki diğer faaliyetlerin önemini takdir etmeyebilir - hatta farkında bile olmayabilir.
Péter Török

1
@ jshowter Zor gerçeklerin / araştırma verilerinin peşindeyseniz, bir tane bulamıyorum. Literatürlerin çoğu Çevik Kalkınma ile ilgilidir ve sizin özel durumunuza uygun bir yazı bulamadı. Google Akademik veya Scirus’ta deneyebilirsiniz.
Ubermensch

3
Biz kötü testçiler değiliz! Bilgisayarımda ÇALIŞTI! ;-)
Joris Timmermans

2
@MadKeithV Ha! Bu benim JIRA (sorun izleyici)
avatarım

Yanıtlar:


39

Soru özellikle Sistem Testleri hakkında soruyor gibi görünüyor , bu yüzden bu cevap boyunca bahsettiğim şey bu.

Test yapmak için seçilecek kötü bir kişi olmakla testte gerçekten kötü olmak arasında yapılması gereken önemli bir ayrım olduğunu düşünüyorum.

Programcılar testlerde neden kötü:

  • Eğer kodu yazdıysanız, işlerin yanlış gidebileceği ve onlarla başa çıkabileceğiniz kadar çok yol düşündünüz.
  • Özellikle çirkin bir böcek bulmak, o zaman gidip düzeltmek zorunda kalacağınız anlamına gelirse, hasta olabileceğiniz bir kod tabanında, o zaman bu motivasyonunuza yardımcı olmayacaktır.

Programcılar testlerde neden iyidir?

  • Programcılar mantıklı düşünür olma eğilimindedir ve sistematik bir şekilde çalışmakta iyidirler.
  • Tecrübeli programcılar, son durumları hızlı bir şekilde belirleme konusunda çok iyi olacak ve bu nedenle faydalı testler ortaya çıkacaktır. (Resmi bir test süreci varsa, bu vakaların çoğunun sistem testinden önce tespit edilmiş ve test edilmiş olması gerekir.)
  • Programcılar, tüm faydalı bilgilerin bir hata raporuna girdiğinden emin olmakta oldukça başarılılar.

Neden programcılar kötü test uzmanıdır:

  • Programcılar test cihazlarından daha pahalıdır (vakaların büyük çoğunluğunda).
  • Zihniyet temelde farklıdır: "(Çalışan) bir ürün oluşturun" vs "Bu şey, içinde herhangi bir (bilinmeyen) böcek bulunan kapıdan dışarı çıkmaz."
  • Test cihazları genellikle daha verimli olacaktır - yani aynı sürede daha fazla test yapın.
  • Programcılar programlamada uzmanlaşırlar. QA uzmanları testlerde uzmanlaşmıştır.

4
Programcıların mantıksal düşüncesinin iyi bir test cihazı olmanın zararı olabileceğini unutmayın. Bir programcının kaç kez "ama bu imkansız!" İle tepki verdiğini gördünüz. ne zaman bulunan bir hata ile karşı karşıya? Sadece akıl yürütmelerinde, böceği "imkansız" yapan ciddi bir şeyi kaçırdıklarını bulmak için.
Joris Timmermans

2
@CraigYoung - hatalı bir mantıksal düşünme olduğu açık, ama bu çok yaygın (sistemler karmaşıktır). Mesele şu ki, testte “gereksiz” testleri ortadan kaldırmak için mantıksal düşünmeyi kullanmamalısınız ve geliştiricilerin bu türden düşünmekten kaçınması zor görünüyor.
Joris Timmermans

3
+1 Harika, dengeli bir cevap. Ayrıca, otomatik ünite ile programcılar tarafından yazılan entegrasyon testleri ve QA tarafından yapılan sistem testi ile kombinasyonun neden en iyi kombinasyon olduğunu açıklar.
Danny Varod

1
"Zihniyet temelde farklı" için +1. Bunlar, sonuçta, ilgili (ancak farklı) yetenek kümeleriyle farklı rollerdir.
joshin4colours

3
@MadKeithV Mantıksal düşünme testlerde hayati öneme sahiptir ve bu nedenle gereksiz testleri ortadan kaldırır. Kara kutuya karşı beyaz kutu testini mi düşünüyorsun? In siyah-box test Eğer uygulama bilgisi olmadan gereksinimlerinden testler geliştirirler. Vb IMHO geliştiriciler olan hatalı varsayımlara, yanlış mantık, denetlemek için iyi şuna, sağlanan onlar uygulanmasını bilmiyorum. Özellikle, kodu yazdılar ve hata yaptılarsa, testlerde aynı hataları yapmaya kaçınılmazdır. Sistem testi kara kutu testi olmalıdır.
MarkJ

19

Programcıların kendi kodlarını test etmede kötü olduklarını düşünüyorum .

Kodumuzun gereksinimlere göre mükemmel çalıştığına inanmaktan hoşlanıyor ve test ediyoruz. Benim yerime kendi kodumuzu test ettik, daha sonra gerçek test döngüsüne girmeden önce birbirimizin kodunu test ettik ve sadece kendi kodumuzu test etmekten çok daha fazla hata yakalandı.


1
Benim iki Sentim. Geliştiriciler genellikle yalnızca son değişiklikleri, son düzeltmeyi, son özelliği test ettiler (onlar yaptım) ve bazı durumlarda diğerlerini test etmek için biraz kör ya da tembel olduklarını söylüyorlar.
Andrea Girardi

11

Programcılar kesinlikle sistemin bazı kısımlarını test etmek için doğru insanlardır - yerlerde etkili bir şekilde yapabilecek tek kişiler onlardır.

Programcıların testlerde çok kötü olma eğiliminde oldukları bir yer, "normal bir kullanıcı gibi kullanıcı arabirimini kullan" bitidir - normal kullanıcılar değildirler ve onlar gibi davranmazlar. Örneğin:

  • Programcılar, metin girişlerini tam olarak elde etmede çok iyi olma eğilimindedir. Gördüğüm oldukça yaygın bir konu, önceleri ya da özellikle boşlukları takip ediyor. Çoğu insan onlar gibi görünmüyor, ancak iyi programcılar muhtemelen dizgelerini fazladan boşluklar olmadan doğru dizge yapmak için dindarlar.
  • Programcılar klavyeci olma eğilimindedir, çalışmayı hızlandırmak için sekmelerden ve diğer kısayollardan yararlanırlar. Normal kullanıcılar fareyi alanlar arasında tutma eğilimindedir.
  • Programcılar, hata mesajlarını dikkate almamak ve sadece Tamam'ı tıklamak yerine sistemin onlara ne söylediğini anlama eğilimindedir.

Normal kullanıcılar programcıların yapamadığı birçok şeyi yaparlar. UAT için tamamen dev ekibine güvenemezsiniz.


3
İlk mermi noktanıza ek bir örnek: Kullanıcılarımız, em-dash ve akıllı alıntılar gibi garip şeyler ekleyen MS Word'den kopyalamaya meyillidirler - bu da bazen yazmadığımız kütüphaneleri bile kırar. Hiçbirimiz bile şimdiye kadar içinde olduğu bir kullanım durumu zorlukla dursun için test alır, aklımızı haçlar böylece Word.
Izkata

1

Teknik düzeyde (ünite testleri, entegrasyon testleri, regresyon testleri) programcılar muhtemelen test edicilere sahip olan kalifiye kişilerdir, çünkü bu tür testler otomatikleştirilebilir ve bu nedenle programlama gerektiren bir şey otomatikleştirilmelidir.

Ama bahsettiğin şeyin bu olduğunu sanmıyorum ve Joel Spolsky'nin ne anlama geldiğine de emin değilim - kalan kısım, gerçek uygulamalı manuel test: bir gereksinim belgesi ve işlevsel özellik Bir test betiği ve ardından bu betiği bitmiş ürüne karşı titizlikle yürütmek.

İyi bir test cihazı olmak, iyi bir programlayıcı yapanlara çoğunlukla dik olan nitelikleri gerektirir. Biraz örtüşme var - analitik olarak düşünebilmelisiniz, genel olarak bilgisayarlarla belirli bir yakınlığa ihtiyacınız var - ama bunun dışında bir test cihazının yetenekleri çok farklı. Bu kendi içinde hem beceri setinize sahip olabileceğiniz hem de aslında bazı insanların yapabileceği anlamına gelmez. Bununla birlikte, gerçekten iyi bir programcı olmak belirli bir tembellik gerektirir (işleri otomatik hale getirme arzusu), gerçekten iyi bir test cihazının kalıcılığa ihtiyacı vardır (tutarsızlıklar için üç bin form alanını da kontrol edin) ve sonuç olarak Genelde fikrinden nefret eden bir test cihazı olmak için gerekenlere sahip olun.

Ve sonra seçici önyargı var: Bir projeye zaten dahil olan bir programcı, ancak marjinal olsa bile, zaten kod temeli hakkında bazı bilgiler içeriyor ve son kullanıcı bakış açısıyla boş bir zihinle yaklaşmakta zorlanacak. . “Bu düğmenin işe yaradığını biliyorum, bu yüzden sadece 'pass' notunu vereceğim”; çok daha ince olabilir ve bu ince etkiler testte kaçırılan kritik vakalara yol açabilir.


1

Tecrübelerime göre, evet, programcılar kötü test edicilerdir. Çok sık başkalarını gördüm ve kendimi "Huh, ancak check-in yapmadan önce test ettim!" Ne zaman önünüzdeki hatayı yeniden üreten bir testçi ile karşı karşıya.

Niye ya? Bunun neden olduğunu bilmiyorum ama belki de işleri görmek istediğimiz için olabilir. Ya da sadece bunu ya da bu özelliği test etmekle baş etmek istiyoruz.

Her neyse, sınavlar öğrendiğimiz bir beceri değil ve programcı olarak çalışmıyoruz çünkü özelliklerin kırılmasında iyiyiz. Ayrıca, uygun test planlamasının veya KG'nin yaptığı diğer tüm şeylerin nasıl yapılacağına dair hiçbir fikrimiz olmayabilir. Artık yeni bir 3d render boru hattınızı uygulamak için bir test cihazının çalıştığından bir test cihazı işi yapmak için nitelikli değiliz.

Soruda olduğu gibi, test yapmak otomatikleştirilmiş bir şey ifade etmiyor, programı kullanarak test ediyor.


1

Birkaç test seviyesi vardır. "Düşük seviye" testi geliştiriciler tarafından yapılabilir ve yapılmalıdır. Bence birim testiginde.

Öte yandan, "yüksek seviye" testleri tamamen başka bir şeydir. Genel olarak, geliştiricilerin yetenekleri kaçırdıkları için değil, birkaç saat içinde düşünmenin ve çalışma şeklinin değişmesinin çok zor olduğu için geliştiricilerin kötü olduğunu düşünüyorum.

Kodlarımı mümkün olduğu kadar test etmek için kullanıyorum, ancak bir test cihazı tarafından yapılan en az 10 dakika sonra, bir hata veya donanımın ortaya çıkacağı düşünülecek bir şey ortaya çıktı. Bu, yarattığınız bir şeyi test etmeniz zor bir iştir. Nerede tıklayacağınızı, ne zaman tıklayacağınızı, iş mantığını biliyorsunuz, muhtemelen verilerin nasıl sürdürüldüğünü biliyorsunuzdur. Sen bir tanrısın, asla düşmeyeceksin.


0

Ne tür bir test demek istiyorsun? Kapsamlı ayrıntılı testler demek istiyorsan, evet demek için bazı nedenleri görebiliyorum, ancak bu tür testlerde çoğu insanın yoksul olacağından şüpheleniyorsam, girdilerin tüm olası kombinasyonlarını bu test için bir gereklilik olarak kabul edersek.

Yazılımı tasarlayan geliştiricinin, kodun ele alınması ve henüz düşünülememiş olabilecek bazı olası sınır durumlarını göz ardı etmesine gelince, tünel vizyonu olabileceğini kabul edebilirim. Örneğin, sayı alan, n ve ardından ekrandan 1'den n'ye basan bir web formu oluşturursam, hiçbir şey girilmemişse veya e veya pi gibi doğal bir sayı olmayan bazı özel durumları kaçırabilirim. . Bu durumlarda yapılması gereken programın ne olduğu şüpheli olabilir.

Test Odaklı Gelişme , testi burada başka bir görünüm kazandırabilecek farklı bir ışığa sokan bir geliştirme metodolojisine bir örnek olabilir.


Bunu sorduğun için teşekkürler. Test etmeyi düşündüğümü söylemek için sorumu güncelledim. Temel olarak, test, yazılım geliştirildikten ve dağıtıldıktan sonra, geliştirme sırasında (ünite testi gibi) veya geliştirme metodolojisinin bir parçası olarak (eş gözden geçirme gibi) yapılan şeydir.
jhsowter

0

Programcılar , kodu yazmadan önce testleri tanımladıklarında testleri tanımlamakta fayda vardır. Uygulama ile daha da iyi oluyorlar.

Bununla birlikte, kod için testler tanımlarken, yazdıkları çok iyi değil. Kodu yazarken yaptıkları testlerde aynı kör noktalara sahip olacaklar.

Manuel test yapmak için programcıların kullanılması sadece saçma. Manuel test kendi başına yeterli saçma; programcıların bunu yapması çok saçma. Pahalıdır ve yetkili programcıları uzaklaştırır.


Yazma birimini ve entegrasyon testlerini savunduğum kadar, TDD'nin (veya önce testleri yazma) bunu nasıl düzelttiğini görmüyorum. Eğer kodundan önce ana başarı senaryoları yazmak, muhtemelen olmayacak hataların çoğu bulmak. Yanlış gidebilecek her şeyi düşünmelisin. Kodunuzu yazmanız, bunlardan bazılarını bulmakta yardımcı olabilir, dalların üzerinden geçebileceğinizden ve onları neyin kırabileceğini görmek için çağırdığınız yöntemlerden yararlanabilirsiniz.
Danny Varod,

Ayrıca, geliştiricilerin kaçırdığı hataların birçoğu, API çağrı siparişiyle ilgili idi. Çoğu birim testinin kapsamadığı bir şey, özellikle test ettiğiniz (ve henüz uygulanmayan) etkileyebilecek başka yöntemlerin ne denebileceğini bilmiyorsanız.
Danny Varod,

@Danny: TDD ile, başarısız bir teste cevap olarak sadece dallar veya yöntemler yazmalı ve başarısız testin geçmesi için sadece gerekli olan kodları yazmalısınız.
kevin cline

TDD metodolojisini biliyorum, sadece sonuçlara katılmıyorum.
Danny Varod

0

Özellikle geliştiricilerin başarısız olduğunu gördüğüm bir test türü, gereksinimin karşılanması durumunda yapılan testlerdir. Geliştiricilerin gereksinim içinde bir şey düşündüğü ve test edenlerin ne anlama geldiğini düşündüğü genellikle iki tamamen farklı şeylerdir.

Yakın zamanda develoepr'den delta ihracat yapmasının istendiği bir tanesini ve bir kez gönderilmemiş kayıtları almak anlamına gelen dev düşüncesini ve testçilerin yeni kayıtlar ve herhangi bir değişiklik almayı kastettiğini düşünebilirim. Kimin doğru olduğunu bulmak için müşteriye geri dönmek zorunda kaldılar. Kodu gözden geçirdim ve aynı şartlar doğrultusunda dev'in yaptığı gibi varsayım yaptım. Çünkü mantıksal olarak güncellemeleri dahil etmek isteseydiniz, onlardan bahsederdiniz. Ve genellikle bu belirsiz şeyleri tespit etmekte iyiyimdir çünkü eskiden her şeyin kullanıcısı oldum.

Bu yüzden, testi yapan diğer devs'ler aynı varsayımların çoğunu yapma eğiliminde olacaklardı çünkü onlar da "X yardımcısı Y demek istiyorlarsa daha fazla ayrıntıya sahip olacaklardı, çünkü yapmadan önce cevaplanacak çok fazla ayrıntı vardı. Ancak, şartlar yazarları böyle düşünmezler, bu yüzden şartlar yazarları gibi daha fazla düşünen birinin geliştirici varsayımlarını test etmesi gerekir ve geliştirici olmayan biri, bir sorun olduğunu görmek için daha iyi bir insandır.

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.