Kod incelemesi sırasında test yazmak faydalı olmaz mıydı?


24

Bir meslektaşım ilginç bulduğuma dair bir fikir buldu.

Kod incelemesi sırasında, TDD yapmadığımızı varsayarak incelemeyi yapan kişi tarafından testler yazmak faydalı olmaz mıydı?

Bu soruya göre, bunun tamamen akademik bir proje olduğunu varsayalım. Ayrıca takım 4 kişiliktir. Herkes dili bilir ve kullanılan tüm araçlara / kütüphanelere / çerçevelere aşinadır ve testler yazabilir. Bu yüzden, temel olarak üst düzey fullstack olmayan insanlar ninja mühendisleri, ancak iyi kodlayıcılar yönetiyor.

Bulduğum artıları:

  1. Anlamlı testler yazmak için inceleme sırasında daha derin bir kod anlayışı teşvik eder.
  2. Daha sonra test edilen kodun yazarı tarafından yapılan testlerin kod incelemesini ekleyebilirsiniz.

Eksileri buldum:

  1. Kod yazma ve test etme arasında geri bildirim döngüsü büyür.

EDIT: "Normal" web uygulamalarında iyi çalışmayacağını biliyorum. Aklımdaki şey, ayrıntılara özen gerektiren karmaşık, bilimsel algoritmalar uyguladığınız bir köşe durumuydu. Kendi grafik kitaplığımı, NLP'yi vb. Uygulamak gibi bir şey varsayalım. Yazdığımız kodun veritabanlarından izole edilip edilmediğini merak ediyorum, ancak kaynakların anlaşılması gereken diğer kişi, kontrol seviyesinin eklenmemiş olup olmadığını anlamak çok zor kodlayın ve anlamlı bir test yapın, tüm süreci daha az belirgin hatalara karşı daha az eğilimli hale getirin;


3
Bu test grubunun, geliştirme sırasında veya yerinde olması gereken testin üstünde ve üstünde olup olmayacağından bahsetmiyorsunuz.
Robbie Dee

3
"TDD yapmıyorsak" en içten yazmak (test-in isolotaion) yazmak yararlı olabilir ancak daha zordur çünkü tdd kodunu izole etmek genellikle zordur. Kabul testleri ve / veya entegrasyon testi, tekrarlanabilir, kırılgan olmayan ön koşullar tanımlamanıza izin veren bir veritabanı soyutlama katmanına (depo api) sahip değilseniz, aynı zamanda ve / veya kırılgan olacaktır.
k3b

4
@JoulinRouge: TDD bu konuda yardımcı olur. Kod olmadığından, testi kodunuza göre ayarlayamazsınız.
Jörg W Mittag

6
Bu gerçekten uzun bir kod incelemesi olacak gibi geliyor.
David,

2
Bir meslektaş incelemesinin yazdığınız her satırı inceleyen, stil yönergelerine ve en iyi uygulamalara göre kontrol eden ve yazmayı düşünmediğiniz ünite testlerini yazan bir programcıya dahil olduğu yerlerde çalıştım.
candied_orange 10:16

Yanıtlar:


7

Kod incelemesi sırasında testleri yapan kişi tarafından test yazmak faydalı olmaz mıydı?

Testler yazmak için iyi bir zamanın, bir durum için bir teste ihtiyacınız olduğunu farkettiğinizde olduğunu öğrendim.

Bilgisayarlar için görev değişimi pahalıdır - insanlar için daha da fazlası.

Zamanın bu noktasında, testin gereklilikleri ve bağımlılıklarını genel olarak iyi anlıyorsunuz. Bu yüzden ekibinizin soruna daldırılmasından yararlanın. Gelecekte yeni testinizi hassaslaştırmanız gerekiyorsa, harika, zaten test çerçevesini / fikstürlerini uygulamalısınız ve yapmanız gereken tek şey iyileştirilmesi gereken kısmı değiştirmek.

Kod incelemesi sırasında bu olursa, neden devam etmiyorsunuz? Bunu daha önce yaptım. Bilmemekten daha iyi olduğunu, özellikle de çabucak yapabiliyorsanız, daha doğrusu yapmazsanız daha iyi olduğunu öğrendim.

TDD yapmadığımızı varsayarsak?

TDD uygulaması yapsanız bile, kod incelemesi yaparken bir teste ihtiyacınız olduğunu anlarsanız, sahip olmadığınız bir test, neden o zaman oraya testi yazmıyorsunuz?

Artıları

  • Odak noktanızı incelenmekte olan koda uygulayın.
  • Bazen kod gözden geçirme, insanların girmediği bir takılma ve sohbet süresi haline gelir. Bir test yazmak, herkesi daha aktif olarak incelenen kod hakkında düşünmeye teşvik eder.
  • Takımın daha küçük üyeleri, test yazma deneyiminden öğrenme fırsatı bulacak.
  • Takımınızda sahip olduğunuzu bilmediğiniz yetenekleri tanımlayabilirsiniz.

Daha fazla testin daha fazla koda yol açabileceği gerçekten bir aleyhte midir? Test gerekliyse ve test için kod gerekliyse, ve şimdi sizde var, o zaman bu iyi bir şey.

Uyarılar

Belki takımın bir kısmının başka şeylere odaklanması gerekir. Öncelikler arasında bir dikkat dağınıklığına neden olursa veya kod incelemeniz programa uymuyorsa, testin asıl yazmasını sınırlamanız veya kesmeniz gerekir. Bununla birlikte, kod incelemesi kesinlikle yazılması gereken testleri belirleyebilir ve belki de en azından yazarın daha sonra tamamlaması için gizlenebilir.


22

Bu bir uyarı ile harika bir fikir. Geliştirici yazılı testlerini gözden geçiren yazılı testlerle değiştirmeyin. Gözden geçirenlerinizin köşe vakalarını ve kodu kıracak girişleri aramasını sağlayın. Başka bir deyişle, orijinal geliştiricinin yazmayı düşünmediği yeni testler yazmalarını sağlayın.

Karakterizasyon testleri yazmak, yazmadığınız bir kod parçasını anlamak için kesinlikle harika bir yoldur. Hakemlerinizin kodda ek testler yürütmesini sağlamak, onlara kodun nasıl çalıştığını, nasıl kırılabileceğini ve nasıl geliştirilebileceğini daha iyi anlamalarını sağlar. Bu arada, kod kapsamınızı arttırın.

Bunların hepsi kitabımda kazanıyor.


5
Neredeyse kod gözden geçirme konusunda deneyiminiz var ...
syb0rg

@ Syb0rg'nin neden bahsettiği hakkında hiçbir fikrin yok ... Bunu kanıtlayamazsın. =;) -
RubberDuck


2
Ayrıca, bir test vakası, incelemede keşfedilen bir kusuru tanımlamanın en az belirsiz yolundan
ibarettir

1
@ syb0rg Rubber Duck binlerce veya milyonlarca programcının kodlarını düzeltmesine yardımcı oldu . Kodu gözden geçirmek için çok fazla kim gördü?
jpmc26

18

Bu fikrin tamamen değersiz olduğunu sanmıyorum - ancak TDD ve arkadaşlarının asıl yararı, sorunların erken bulunmasıdır . Geliştirici aynı zamanda hangi köşe kasalarının özel dikkat gerektirebileceğini tespit etmek için en iyi şekilde yerleştirilmiştir. Bu, kod incelemesine kadar bırakılırsa, bu bilginin kaybedilmesi riski vardır.

Kod incelemesi sırasında test yazmak, geleneksel manuel testlerle aynı problemden muzdarip olacaktır - iş kurallarının anlaşılması, geliştiriciden geliştiriciye, titizlikle değişebilir.

Ayrıca, geliştiricilerin kodlarını daha iyi test edip etmeyeceklerine dair çalışacak ve çalışacak olan eski tartışmalar var, eğer daha ciddi hataları yakalamak için daha ileride bir test fonksiyonu olduğunu biliyorlardı.


Mükemmel cevap. Peki ya TDD'yi yapmazsak, çünkü insanlar istemiyorlar ve benim üstümden kaldıraç kullanmıyorum, ancak elde ettiğimiz sonucun yanlış pozitif olmadığından emin olmalıyız çünkü bir hata sonuçlarımızı çarpıttı. Asıl risk, insanların doğru bir anlayış olmadan bir şeyi uygulamak için acele etmeleri, akılda tutmamalarına dikkat ederek testleri geçmesi ancak sonuçta yanlış kod üretmesidir. Belki çift programlama sorunu çözer mi? Fakat daha sonra birisinin bir şeyi anlamaya zorlamak kolaydır.
Sok Pomaranczowy

Belki de testleri yazan bir başkasının yanı sıra, geliştirme süreci devam ederken bunlar geliştirme koduna karşı çalıştırılabilir. Söz konusu geliştiricilerin, kodun bulunduğu yerle aynı sayfada olması gerekir, aksi halde kodu yazan geliştirici, gerçekten bir şeyi çalıştırmak yerine sürekli olarak yangınla mücadele etmeyen testler olabilir.
Robbie Dee,

Sorun "Konformasyonel Önyargı" olarak adlandırılır.
16:16

Aslında, kod inceleme sürecinden uzaklaşıp kodun test sürecini etkileyeceğini söylerdim, bu sizin istediğiniz bir şey değil, ayrı bir test cihazı ve kodlayıcıya sahip olmanın temel avantajını ortadan kaldıracaktır.
ArTs

1
@RobbieDee Suç alıcısı gerçekten önemliyse, sağlıksız bir geliştirme ortamına sahipsiniz. Bu, faydalı olabilecek birkaç testi kaçırmaktan çok daha kötü.
jpmc26

5

@ RobbieDee'nin cevabıyla aynı fikirdeyim ama ekleyeceğim biraz daha var.

Bu fikri gerçekten seviyorsanız, neden aynı kişilerin testleri kullanıcı kodunun çalıştırılabilir kabul kriterleri olarak koddan önce yazmasını istemiyorsunuz?

Bu aynı şeyi yapar, geri bildirimleri kısa tutar ve herkesin hikayenin etrafında daha fazla değerli olacağını düşündüğü bir tartışma yapmasını sağlar.

Dezavantajları bitmeyen kabul kriterleri toplantısı tehlikesidir :-( ve uygulama koduna bir göz atmak için insanları kod incelemesinde bulmaya çalıştığınızı düşünüyorum ama programlama ve çiftleri daha iyi bir çözüm olarak eşleştirmeyi öneririm. bu problem.

OP, bunun daha detaylı veya zorlu bir algoritma özelliği olduğunu belirten bir düzenleme eklendi.

Buna cevaben sorun ve çözüme daha fazla göz atma içgüdüsünün iyi olduğunu ekleyeceğim. Belki herkes uygulama kodunu ve testlerini gerçekten zor bitene kadar birden fazla kişiyle birebir eşleşin. Her biri yeni fikirler ortaya koyuyor ve daha fazla değer katıyor.

Eşleştirme gibi ama daha fazla insanla bazen mob programlama deniyor. Neredeyse bahsettiğin şey bu, ancak daha sonra resmi bir inceleme yapmak yerine, yazarken yardımcı oluyorlar. Bu herkes için değildir ve çalışmasını sağlamak için güçlü bir sürücü (lider) veya birbirleriyle ve süreçle çok rahat bir takım gerektirebilir.

Mob-programlama gerçeğinden sonra, problemi gören ve iyileştirmeler öneren birçok gözün aynı avantajlarının çoğuna sahip olacağını ve ekibinizin bu şekilde rahatça çalışabildiğini görürsem, yardım edebilirim ama gerçekten gerekli tutmaya çalışacağım. Bunun oluşumunu en aza indirdiği için ekibi yavaşlatabileceğini düşünüyorum.


Belki geliştiriciler uygun gördükleri şekilde testler yazmalı, onları depoya yüklemelidirler, ancak incelemeyi yapan kişi kendi testlerini yazmalı ve geliştiricinin yazdığı testlere asla bakmamalıdır. Her iki testte de her şey yolunda giderse, ancak gözden geçiren kişi testleri başarısız olursa bir sorun olabilir mi?
Sok Pomaranczowy

1
@SokPomaranczowy geçmişte farklı insanlardan testler yazarken fazlalık ekledi. Bence hayati öneme sahip bir yazılım yapmıyorsanız, bu boşa harcanır ve bunun yerine zamanınızı harcamanın en iyi olduğu yere odaklanmalısınız (testlerin hiçbirini TÜMÜ asla yazmazsınız) ve ekipte iyi iletişim kurarak düşünüyorum. çok daha iyi bir yaklaşım.
Encaitar

@Encaitar Katılıyorum, bu muhtemelen işleri daha iyi hale getirmeyecek devasa bir lavabo gibi görünüyor. ROI ve tüm bunlar ...
sara,

3

Söylediğiniz gibi, eğer bir TDD takımı işletiyorsanız, kod zaten test edilmek zorunda olduğu için bu durum oldukça fazladır.

Genel olarak, bunun bu kadar harika bir fikir olduğunu düşünmüyorum, ancak şu anki yaklaşımınıza ve sizin için neyin işe yaradığına bağlı. Temel olarak, gördüğüm sorun, testlerin "kısa geri besleme döngüsü" avantajını kaybetmenizdir. Yeni bir kod yazarken bile bir şeyi kırdığınız anda anında bildirim almak, testlerin gerçekten parladığı yerdir. Kod incelemesine kadar testi ertelerseniz, temel olarak "peki biz bu sorunu daha kısa sürede ve daha az sayıda insanla birlikte çözebilirdik, ama en azından hepimiz bir şeyler öğrendik (belki)" diyorsunuz. İnsanların incelenmek üzere sınama kodu göndermesini sağlamayı tercih ederim ve ardından sınamaların doğruluğunu ve bakımını yargılıyorsunuz. Sonuçta, kod incelemesi kod yazmak için değil, inceleme amaçlıdır.

Öte yandan, inceleme sırasında yapılan testler / kodlarla FIDDLE yapmanızı öneririm. Bir şeyleri kırmaya çalış. Bir if koşulunu yorumlayın. bir boole değişmezini true / false ile değiştir Testlerin başarısız olup olmadığını görün.

Ama evet, sonuçta, testlerinizi kodunuzla birlikte yazmanızı ve hepsini bir kerede gözden geçirmenizi öneririm.


2

Kod incelemesinde ne yaptığınıza bağlı. Bu aşamada test yazmanın iki ana nedeni olduğunu düşünüyorum:

  • Öncelikle, kod incelemesi sırasında da yeniden yapılanma yaparsanız ve uygulamak istediğiniz yeniden yapılanmanın türünü kapsayacak kadar birim test olmadığını unutmayın, bu tür testleri ekleyin.

  • ikinci olarak, kod size bir hata yapmış gibi görünüyorsa ve bunu ispatlamasını (veya onaylamamasını) istiyorsanız, bunun için bir test yazın.

Her iki durumda da, şu anda orada olmayan, ancak yapılması gereken testlere ihtiyaç duyulduğu belirtiliyor. Tabii ki, eğer bu tür testlerin gözden geçiren tarafından mı yoksa asıl yazar tarafından mı yazılması gerektiği takım kültürünüze bağlı olabilir, ancak birileri testleri yazmalı.

Aslında, bunun sadece "karmaşık, bilimsel algoritmalar" için uygun bir "köşe durumu" olduğunu düşünmüyorum - bunun tam tersi, belirli bir kalite derecesi beklediğiniz herhangi bir yazılım için uygundur.


2

Hayır yapma! TDD'nin korkunç olduğunu düşünmelerini sağlayacaksın.

@ K3b'nin soru hakkındaki yorumunda haklı olduğunu düşünüyorum. TDD tarzı bir işlemle yazılan kod, sınamalar olmadan yazılan koda çok farklı şekilde bakma ve etkileşimde bulunma eğilimindedir. Test edilmemiş koda (iyi) testler eklemek, amacı ve hareket eden parçalarını netleştirmek için genellikle kodu yeniden gözden geçirme işlemi gerektirir.

Kodu yazdıktan sonra testleri ekleyerek, TDD'nin faydalarının mimari yönlerini kaçırıyorsunuz (aklımdaki en büyük yararlardan biri). Sadece bu değil, koda pek aşina olmayan bir başkasına, eklenmesi zor olan testler ekleme şansını denemesini istiyorsunuz.

Test ekleyen kişi, kodu önemli ölçüde yeniden değerlendirmek zorunda kalacak veya test edilemeyen kodu test etmek için çok çalışmalıdır. Her iki durumda da, deneyimden zevk almayacaklar. Bu klasik TDD olmasa da, böyle görmeyecekler ve onları TDD'den bir kez ve herkes için çıkarabilirsiniz.

(Zaten bir TDD sürecini takip ediyorsanız, kod incelemesi sırasında ek testler yazmak daha az zararlıdır, ancak deneyimlerime göre, eğer zaten iyi yazılmışsa, sınavı veren kişiye ekstra testi açıklamak bu kadar kolaydır İnceleme için kod yazıp, yazmalarını sağlayın.)


1

Kod incelemesi sırasında birim testleri, geliştirme sırasında birim testleri için zayıf bir alternatiftir.

Önerdiğiniz şey sezgisel olarak çok mantıklı geliyor. İnceleme ne için? Kodun iyi olduğunu kontrol etmek için. Testler ne için? Kodun iyi olduğunu kontrol etmek için. Öyleyse neden ikisini birleştirmiyorsun?

İşte nedeni.

Teste kod getirmek zor bir iştir. Yapması gereken tek şeyde çalışan kod yazmak bir şeydir; Etkin ve verimli bir şekilde test edilebilecek kod yazmak da başka bir şeydir. Sadece kodun şu anda iki senaryo altında çalışması - "gerçek iş" ve "test" - çok daha fazla esneklik talep ediyor, bu kodun kendi başına anlamlı bir şekilde ayakta durabilmesini istiyor.

Kodunuzu test edilebilir olması için yazmak, ekstra iş ve beceridir. Biri üstlenmeden başka daha başlamama akılda test edilebilirliği ile yazılmamış zaman, test edilebilir kod, önemli bir görev olabilir.

Geliştirici ve inceleyen arasındaki çabayı çoğaltıyorsunuz. Muhtemelen, geliştirici en azından yapılmaksızın onun kodunu teslim edilmez bazı işe yarıyor o güven seviyesinde. Zaten kodu test etmesi gerekiyor. Şimdi, farklı seviyeler ve test kapsamları var. QA, geliştirici ve incelemeden sonra kodu test eder . Ancak geliştirici ve incelemeci için uygun olduğunu düşündüğünüz kapsam ne olursa olsun, geliştiricinin kodu bir kez nasıl test edeceğini anlaması bir anlam ifade etmiyor , ancak testlerini atılması ve yeniden üretilmesini zorlaştırıyor ve ardından incelemeyi yapması tekrar test geliştir, bu sefer otomatik ve tekrar üretilebilir olanlar. Sadece ikisinin de aynı testleri yazmak için zaman harcamasını sağlıyorsunuz - bir kez zayıf, bir kez iyi.

İncelemeyi çok daha uzun, daha zahmetli bir adım haline getiriyorsunuz. Eğer test inceleme sürecinin önemli bir parçası ise, bazı testler başarısız olduğunda ne olur ? Gözden geçiren kişi bütün testleri yaptırmaktan sorumlu mu, bu yüzden de kodu ayıklaması gerekiyor mu? Yoksa bir tanesine sınav yapmak, bir tanesini geçmek için ileri geri pinpon atılacak mı?

Bazen birbirleriyle ortogonal olan bir sürü test yazabilirsiniz, bu yüzden pinpon yapmaya gerek yok. Hakem, bir düzine testini yazıyor, bunların yarısı başarısız oluyor, geliştirici hataları düzeltiyor ve tüm testler geçerli kalıyor ve şimdi geçiyor. Ancak ... çoğu zaman, engelleyici hatalarınız ya da yeniden tasarım ve API değişiklikleri gerektiren hatalarınız olur ya da olmaz. İnceleyici ile geliştirici arasında ileri ve geri testler yapmakla ilgili sorumluluk alıyorsanız, o zaman aslında inceleme aşamasında değilsiniz. Hala gelişiyorsun.

Testler yazmak istemek daha ayrıntılı incelemeyi teşvik etmiyor. Temel olarak, daha derinlere indiğiniz, daha fazla test yazmanız gerektiği ve muhtemelen sisteme girmeleri gereken zor testler olacağı anlamına gelir .

Teşvik ettiği yerde testleri yazan geliştiriciyle karşılaştırın: Önemli testler yazmazsam, gözden geçiren kişi bunu incelemede gösterecektir.

Gözden geçiren kişi bile, kodun kapsamlı testlerini gözden geçirmesi gerekiyorsa sistemi daha iyi anlayacaktır , daha sonra derin kazma testi yazmayı bırakabileceği zaman kendisinin karar vermesi gerekiyorsa ve kod incelemesini tamamlaması gerekir.

Geliştirici birim testleri yazmıyorsa, yorum yapan kişi de yapmaz. Testleri ortak bir uygulama olarak benimsemenin birçok engelleri vardır. Belki çok fazla baskı altındasın ve kod tabanını test etmek zor. Belki test konusunda o kadar tecrübeli değilsindir ve öğrenme eğrisini karşılayamayacağını hissediyorsun. Belki de test yazan kişilere tehdit notları gönderen bir balta katiliniz vardır. Bilmiyorum!

Ancak sebebi ne olursa olsun, gözden geçirene ve geliştiriciye eşit şekilde uygulanacağına iddia etmek güvenlidir. Ekip stres altındaysa, gözden geçirenin geliştiriciden daha fazla vakti yoktur (eğer öyleyse, işi yeniden dağıtır, böylece insanlar çok stresli olmaz ). Hiç kimse birim testlerini nasıl iyi yapabileceğini bilmiyorsa, eleştirmen de muhtemelen bunu yapmaz (eğer öyleyse, oturup arkadaşlarına ders vermelidir ).

Bu öneri, kazancı bir meslektaştan diğerine geçmeye çalışmak gibi geliyor. Ve bunun iyi bir şekilde çalışmasının bir yolunu göremiyorum, çünkü her şeyden önce, çünkü birinin test edebileceği tek kişinin olduğu ve başka birinin yapamayacağı bir durum yaratmak gerçekten zor (ve sağlıksız) Herhangi bir test.


Ne yapar işi olduğu yanı yorumu kapak testleri sahip. Geliştirici zaten on test yazdıysa, gözden geçiricinin başka bir on önerisinde yardımcı olması muhtemeldir, geliştiricinin herhangi bir şey yazmamış olması gerekir.

Köşe kutularını test etmek büyük bir görev ise, bunu takım boyunca daha yaygın bir şekilde dağıtmak anlamlı olabilir. ** Kod ilk kez test edilebilir olduğunda, daha fazla test yazmak çok daha kolay hale gelir. **

İnceleme için bir zamandır nokta köşe durumlarda. Ve eğer eleştirmen içeri girip bulduğu köşe davaları için bir test yazabilirse, hey - en iyisi! Ancak, genel olarak konuşursak, gözden geçirenin geliştiricinin çok kötü bir fikir gibi görünmediği yerlerde testler yazabileceğini varsayarsak .

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.