Birim testini nasıl daha keyifli hale getirdiniz? [kapalı]


18

Birim testlerini her zaman sevdiyseniz, sizin için iyi! Ama bir sevme ile doğmamış talihsiz olanlar için, bu görevi nasıl daha keyifli hale getirmeyi başardınız?

Bu "birim test için doğru yol nedir" sorusu değildir. Sadece birim testler yazma sıkıntısını (söylemeye cesaret) azaltan küçük kişisel hileler bilmek istiyorum.


1
Birim testleri ve diğer testleri yazmayı seviyorum, çünkü hemen hemen herkes buna benziyor (bazen test ettiğim araçları yapmakta da emiyorlar). Hayır, geliştirici olarak emilmiyorum. Kullanılabilirliği, göz şekerini ve otomasyonu seviyorum. MbUnitKütüphane hayatımı değiştirdi. Otomatik test önemlidir. Otomatik test zaman kazandırır. Otomatik test para tasarrufu sağlar. Otomatik test hayat kurtarabilir. Otomatik test tek yoldur. Otomatik test başka bir güvenlik ağıdır. Büyük bir mimari üzerinde çalışan 50 kişiden biri olduğumda, bir duvarda başka bir tuğla gibi hissediyorum. Birim testleri ile kontrolüm altında.
Meslek

Birim testindeki tembellik ve hayal kırıklığı, beynimizin işe yaramaz olarak algıladığı işe normal bir tepkidir. Çok az veya negatif YG'si olan birim testleri yazmaktan ve korumaktan nefret ediyorum. Bununla birlikte, yararlı testler yazmak hoş bir iştir, ancak neyin yararlı olduğunu ve neyin çöp olduğunu anlamak kendi başına bir beceridir. Bloguna dayanarak bu konuyla ilgili bir kitap yazan bir adam var, buradan okumaya
başlayabilirsiniz

Yanıtlar:


22

Öncelikle size katılıyorum - birim testlerinizi zaten tamamlanmış kod üzerine yazıyorsanız veya kodunuzu manuel olarak birim test ediyorsanız, bunu da son derece sıkıcı buluyorum.

Benim için ünite testinin gerçekten eğlenceli olmasını sağlayan iki yolu olduğunu düşünüyorum:

  1. Test Tahrikli Geliştirme (TDD) kullanarak - testleri yazmak önce kodumda ihtiyacım olan bir sonraki işlevsellik veya davranışı düşünmeme izin verir. Son hedefime doğru küçük adımlarla ilerliyor ve her birkaç dakikada bir bu hedefe yönelik somut ilerleme görüyorum, son derece faydalı ve keyifli.
  2. Hatalar olduğunda, doğrudan hata ayıklayıcıya gitmek yerine, hatayı yeniden üreten başarısız bir birim testi yazmanın bir yolunu bulmak eğlenceli bir sorundur. Sonunda kodunuzu başarısız kılan koşulları anlamak, sonra düzeltmek ve yeni başarısız test için çubuğun yeşile dönmesini izlemek (ve mevcut tüm testleriniz için yeşil kalmak) son derece tatmin edicidir.

12

Kendini beğenmiş üstünlük.

Ben sadece şaka yapıyorum. "Bana bak, iyi programlama alışkanlıkları geliştir! Bu 'birim test' şeyleri On Yıl Önce Ben'in asla yapamayacağı bir şey - ne bir aptal! Ve sadece bir sonucu olarak yakalayacağım tüm hataları düşün Bu sıkıcı, sıkıcı iş şu an yapıyorum - kodum harika olacak! Kesinlikle bir zam alacağım! * "

* - Hayır, yapmayacağım.

Egzersiz yapmak ya da sağlıklı yemek gibi görüyorum; somut faydalar gerçekten başlayıncaya kadar ("Kutsal toplar, gerçekten üretime sıkışmış bir bok ton regresyon hatası yakalıyorum!"), Doğru Şey'i yaptığınızı bilmenin ahlaki gururu sizi taşımanıza yardımcı olabilir vasıtasıyla.


7

Birincisi, neredeyse hiçbir zaman orada oturup birim testleri yazmıyorum. Birim testleri, kendi içinde bir amaç değil, bir amaç için araçtır. "Bu kod olması gereken temel görevi yerine getiriyor mu?"

Örneğin, bazı insanlar bir işlev yazacak ve daha sonra birkaç değer üzerinde test etmek ve çalıştığından emin olmak için etkileşimli bir oturum açacaktır:

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

Ama şimdi bir hata keşfediyorsunuz:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

Yani düzeltirsiniz:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

Ama şimdi hala çalıştığından emin olmak için test etmelisiniz:

>> fact 10
=> 3628800
>> fact 7
=> 5040

Gördüğünüz gibi, aynı testleri tekrarlamaya devam ediyorsunuz ... ve sonuçları görsel olarak karşılaştırmanız gerekiyor. Birim testi, bu durumda tekrardan kaçınmanın bir yoludur; ne kadar iş yapmanız gerektiğini azaltır. Ve bu aptalca küçük bir örnek olsa da, gerçek dünyada, manuel olarak test etmek gittikçe daha önemli ve daha zor hale geliyor. Bunun elbette anlamı insanların tek tek bileşenleri test etmemesidir; sadece tüm programı test ediyorlar. Ama sonra böcekler ortaya çıkıyor ve bulmak çok daha zor. Ya da hatalar olur ve giderilir, ancak birileri aynı hatayı tekrar tekrar sunar, çünkü kimse bunun olmadığından emin olmak için bir test örneği eklemedi. Ya da birisi büyük bir koda bakar ve "Bunun ne yapılması gerektiği hakkında hiçbir fikrim yok, çünkü belgelenmediği ve testleri olmadığı için ... Bu hatayı düzeltirsem, ona bağlı başka bir şeyi kıracağım hakkında hiçbir fikrim yok; belki bunu sıfırdan yeniden yazacağım. "

Birim testleri, bu durumlarda tüm ekstra işleri azaltır. Onları eğlenceli hale getirmenin en iyi yolu, insanların değiştirdikleri tüm işleri ve her bir kod parçasının ne yapması gerektiğini bilmekten kaynaklanan ekstra esnekliği anlamalarını sağlamaktır. Bir dereceye kadar, insanların birim testlerin ne kadar önemli olabileceğini anlamak için geniş bir kod tabanı yazma ve sürdürme konusunda biraz daha fazla deneyime sahip olmaları gerekir; tüm kodları bir kez yazdıkları ve atıldıkları bir şeyse, asla tam olarak alamazlar.

Ve ünite testleri, gerçekte çalıştıktan sonra “bildiğiniz” bir koda sahip olduğunuzda ekstra bir angarya olarak yazılmamalıdır. Ünite testleri önce veya en azından söz konusu kodu yazdıktan hemen sonra (bazen önce yazmayı unuttuğunuz için) yazılmalıdır. Buna test odaklı geliştirme denir ve API'larınızı daha iyi hale getirmenize yardımcı olabilir; ilk olarak API'leri uygulayan testleri yazarsanız, kodu yazmadan önce API'lerin nerede bir acı olduğunu öğreneceksiniz ve sadece testleri daha sonra eklemekten çok daha kolay bir şekilde yeniden tasarlayabilirsiniz.


@Biran, katılıyorum. Ama bütün bunlar onu "doğru" bir şey yapar. Ama bunu nasıl eğlenceli hale getirir? Biraz bile mi?
Preets

@Preets Keyiflidir çünkü tekrar eden manuel testler yapmaktan kaçınırsınız. Aslında yaptığınız gibi, ilk yaptığınızda daha keyifli olur , çünkü tasarım sürecinin bir parçası haline gelir, zaten "çalışan" kod için gerçek bir işten sonra değil.
Brian Campbell

Yani, bunu kötü yapmak için zaman harcayın, böylece SAĞ yapmak karşılaştırma ile eğlenceli hissettiriyor? ... Bu işe yarayabilir, aslında ....
BlairHippo

@Biran, katılıyorum, bir "ilk" yapmak gerekir - sadece can sıkıntısını ortadan kaldırmak için değil, ama birim test gerçek faydaları elde etmek amacıyla bunu yapmak için doğru yolu olduğunu varsayalım.
Preets

@Biran, Teşekkürler! Kısa bir süre önce TDD'yi hobi projemde kullandım ve birim testleri hakkında düşünme şeklim değişti.
Preets

5

Bilmiyorum. Birim testini benim için kesinlikle daha keyifli hale getiren şey, yazılımda her değişiklik yaptığımda geçmeyeceğim tüm sinir bozucu, uzun, sıkıcı ve umursamaz hata ayıklama düşüncesidir :)


2
Bu ilginç. Çünkü kişisel olarak, birisi kodumda bir hata bulduğunda kafamı utanç içinde gömüyorum, ama aynı zamanda benim için hata ayıklama süreci aslında oldukça eğlenceli ve ünite testlerinden çok daha eğlenceli. Bu sinsi hatayı yakalamak zorunda bir bulmacayı çözmek gibidir.
Preets

@Preets: Katılıyorum, bazen eğlenceli olabilir, ama benim için tasarım uygulamadan çok daha ilginç. Bu yüzden uygulamaya çok zaman harcamak istemiyorum. Özellikle daha güvenilir zaman çizelgeleri yapılmasına izin verdiği için doğrudan ileri ve tahmin edilebilir olmasını tercih ederim. Yazılım oluşturma sürecinden zevk aldığım kadarıyla sonucun belirleyici olduğunu düşünüyorum.
back2dos

Tamamen katılıyorum! Rastgele hatalara sahip bir sistem uykusuz gecelere neden olabilir .. Seçimim, eğlenmekten başka hiçbir şeyin önemli olmadığı gerçek dışı bir dünyada bir tercihti!
Preets

3

Kaya gibi sağlam, sağlam ve istikrarlı kodları kontrol ederken hissettiğiniz kendini beğenmişlik üstünlüğü. Kod kapsamı aracıyla birim testleri yazıyorsanız, kod kapsamınızın% 90 veya daha yüksek olduğu yorumlarınızda çekinizle övünebilirsiniz.


3

Açıkçası, ilk test geliştirme memnuniyeti ve tasarımınız ve testleriniz bir araya geldiğinde hissettiğiniz duygu vardır. Ancak, önceden var olan / eski kod için yazma testleri zihin uyuşturan ve sinir bozucu olabilir. Projemiz bir bakım modelindeyken, kapsam raporunu oyun olarak kullanarak test edilmemiş kod testleri yazdım. Kapsama sayısını artırmak için kendiniz ve / veya başkalarınızla biraz rekabet yaratabilirsiniz. Kabul ederseniz, çok ileri gidebilir ve bazı kötü testler oluşturabilirsiniz, ancak iyi bir motivasyon aracı olabilir.


Eski kod genellikle kolayca test edilemediğinden, kendimi iyi birim testleri yazmakta zorlanıyorum - bu yüzden sadece süreç acı verici değil, aynı zamanda sonuç (birim testleri) de özellikle yararlı değil: - / En sinir bozucu buluyorum .. Kapsama oyunu olsa iyi bir :)
Preets

1

Akışa girmeye çalışın . Kendinize sert ama ulaşılabilir hedefler belirleyin. Birim testinde hedef ne olabilir? Örneğin, kaliteyi korurken daha hızlı yazmaya çalışın. Birim testleri çok fazla düşünmeyi gerektirmez, bu nedenle yanlış algılama olasılığı düşüktür. Hedefinize konsantre olun ve yaklaştığınızı görmek için sık sık kontrol edin.


ás, neden birim testin fazla düşünülmesini gerektirmiyorsunuz? TDD ile çalışıyorsanız çok fazla düşünmeyi gerektirir. Bu doğru değil mi?
Preets

Haklısın, TDD'yi dikkate almadım.
Tamás Szelei

0

Bazen kendimi motive etmek için, günün başlangıcında mevcut "kod kapsamımı" yazacağım. Sonra her test yazıp geçmesini istediğimde, paketi çalıştırıp kapsam numarasını güncelleyeceğim. Eğlenceli ve neden bunu yaptığımı hatırlatmama yardımcı oluyor. (Başka sebepler de var, ama sayıları seviyorum. Belki de bu sadece benim!)


0

Birim testinin sürdürülebilir bir süre boyunca keyifli olabileceğini düşünmek için aklımı kandırabileceğime kendimi kandırmaya çalışmıyorum.

Birim testinin keyfini çıkaramayacağı gerçeğini kabul etmek bana çok yardımcı oluyor, bu da asla olması gerekmeyen bir yerde bir şey aradığımı fark etmemi sağlıyor.

Bu kısa zihinsel gezilerde, birim testini gerçekten olduğu gibi algıladığım noktaya geldiğimde, yani acımasız, dayanılmaz ve ruh ezici bir şekilde sıkıcı bir görev, kendime, onları bırakmaya gücüm yetip yetmeyeceğimi soruyorum, yani işlevsel doğruluk konusunda yüksek garantiler.

Her zaman cevap, yankılanan bir "hayır" dır.

Kaderimi kabul ettikten sonra, her bir klavye tıklamasında birim testinin sonunun ondan daha yakın olduğunu ilk elden deneyimlerle bildiğimiz, klavye olarak adlandırdığımız bu kare nesneleri önümde harfler, sayılar ve sembollerle itmeye devam ediyorum. gelmiştir şimdiye olmuştur.


Her test iyi veya kullanışlı değildir. Bu, TDD'lerin ve diğer test evangelistlerinin genellikle bahsetmediği bir şeydir. Bahse girerim, karmaşık mantığı test ettiğini, testin zarif olduğunu ve uygulamaya bağlı olmadığını bildiğinizde birim testinden hoşlandığınız nadir anlarda bahse girerim. proje yönergeleri.
KolA

@KolA Yaratıcılık gerektiren zorlu birim testleri olduğu konusunda haklısınız, ancak sonsuz birim testleri yazmak, ilginç olanlardan bile neşeyi emebilir.
bugfoot
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.