TDD yaparken Logging'e ihtiyacımız var mı?


40

Kırmızı, Yeşil ve Refaktör döngüsünü yaparken, testi geçmek için her zaman minimum kodu yazmalıyız. TDD hakkında bilgi edindiğim ve neredeyse tüm kitapların süreci tarif ettiği yöntem bu.

Peki ya tomruklama?

Dürüst olmak gerekirse, bir uygulamada günlüğe kaydetmeyi nadiren kullandım, ancak gerçekten karmaşık olan bir şey olmadıkça, uygun günlüğe kaydetmenin önemi hakkında konuşan çok sayıda gönderi gördüm.
Bu nedenle, bir istisna kaydı yapmak dışında, uygun bir test uygulamasında (birim / entegrasyon / kabul testleri) oturum açmanın gerçek önemini haklı çıkaramadım.

Yani benim sorularım:

  1. TDD yapıyorsak giriş yapmamız gerekiyor mu? başarısız bir test uygulamada neyin yanlış olduğunu ortaya çıkarmaz?
  2. Her sınıftaki her bir yöntemde günlük kaydı için test eklemeli miyiz?
  3. Örneğin üretim ortamında bazı günlük seviyeleri devre dışı bırakılmışsa, bu testler ve çevre arasında bir bağımlılık getirmez mi?
  4. İnsanlar günlüklerin hata ayıklamayı nasıl kolaylaştırdığı hakkında konuşurlar, ancak TDD'nin temel avantajlarından biri, başarısız bir test nedeniyle neyin yanlış olduğunu her zaman bilmemdir.

Kaybettiğim bir şey var mı?


5
Günlüğe kaydetmenin birçok kural için özel bir durum olduğunu düşünüyorum. Bir sınıf / fonksiyon sadece bir şey yapmalı, sadece bir şey yapmalı ... günlüğe kaydetme dışında. İşlevler, günlük kaydı dışında tercihen saf olmalıdır. Öyle ve böyle. Günlüğe kaydetme kuralları ihlal ediyor.
Phoshi

1
Günlük kaydı, kullanılan herhangi bir SW geliştirme metodolojisine dikey değil mi? Belki de sadece daraltmak ve sormak gerekir
hyde

Yanıtlar:


50

1) TDD yapıyorsak giriş yapmamız gerekiyor mu? başarısız bir test uygulamada neyin yanlış olduğunu ortaya çıkarmaz?

Bu, uygulamanızın ihtiyaç duyduğu her olası testi yaptığınızı varsayar, bu nadiren doğrudur. Günlükler, henüz testler yazmadığınız hataları izlemenize yardımcı olur.

2) Her bir sınıftaki her bir yöntemde günlüğe kaydetme işlemi için test eklemeli miyiz?

Kaydedicinin kendisi test edilirse, diğer bağımlılıklara benzer şekilde, her sınıfta tekrar test edilmesi gerekmez.

3) Örneğin üretim ortamında bazı günlük seviyeleri devre dışı bırakılmışsa, bu testler ve çevre arasında bir bağımlılık getirmez mi?

İnsanlar (ve kütük toplayıcıları) kütüklere bağlıdır, testler bunlara bağlı olmamalıdır. Tipik olarak birkaç kütük seviyesi vardır ve bazıları üretimde kullanılır ve bazı ilave seviyeler gelişimde benzer şekilde kullanılır:

"Rails log level üretim modunda bilgi ve geliştirme ve test aşamasında hata ayıklama" - http://guides.rubyonrails.org/debugging_rails_applications.html

Diğer uygulamalar da benzer bir yaklaşım kullanır.

4) İnsanlar günlüklerin hata ayıklamayı nasıl kolaylaştırdığı hakkında konuşurlar, ancak TDD'nin temel avantajlarından biri, başarısız bir test nedeniyle neyin yanlış olduğunu her zaman bilmemdir.

Üretim hataları tüm testleri geçti, bu nedenle bu sorunları araştırmak için başka bir referansa ihtiyacınız olabilir.


26
Titizlikle yürütülen TDD bile mükemmel performans, sistem etkileşimi, üçüncü taraf etkileşimi ile üretim sorunlarını engellemeyecek. Eşzamanlılık sorunları da sınava tamamen dahil etmek çok zordur. "Sadece"% 100 test kapsamı, tüm durumlarda veya ortamlarda doğru olmadığından, kodunuzun% 100'ünün yürütüldüğü anlamına gelir.
Holstebroe

34

Günlük kaydı , bir uygulamanın istisnai olmayan davranışını açıklamakta kullanışlıdır :

Olay , sistemin faaliyetini anlamak ve sorunları teşhis etmek için kullanılabilecek bir denetim izi sağlamak amacıyla bir sistemin yürütülmesinde yer alan kayıt olaylarını günlüğe kaydeder . Karmaşık sistemlerin, özellikle kullanıcı etkileşimi az olan uygulamalarda ( sunucu uygulamaları gibi ) anlaşılması için çok önemlidirler ...

Uygulamanın nasıl test edildiğine ve istisnaların ne kadar iyi günlüğe kaydedildiğine bakılmaksızın, kullanıcıları sorabilir,

Programınızın çıktısı 0 olurken 1 olur, neden bu?

İstisnai olmayan davranışını açıklamak için uygulama config, parametreler ve diğer çalışma zamanı ayrıntılarının ne olduğunu doğrulamak için günlüğe kaydetmeniz gerekir.

Yukarıdaki açıdan bakıldığında, günlük oluşturma, geliştirmeye göre daha fazla desteğe yöneliktir . Uygulama yayına girdikten sonra, programcıların daha fazla gelişmeye odaklanmalarını sağlamak için bir başkasının kullanıcılardan gelen soruları ele almasına izin verilmesi arzu edilir.

Hangi uygulamanın yaptığını günlüğe kaydetmek, bir başkasının , kodun içine girmeden ve geliştiricilerin dikkatini dağıtmadan, neler olup bittiğini açıklama istekleriyle program davranışını anlamasını sağlar .


5
"Günlüğe kaydetme daha fazla desteğe yönelik" için +1. Gerçekten kafasına çivi vur.
Tibos

1
"İstisnai olmayan davranış" ve "günlüğe kaydetme daha fazla destek odaklı" için +1. Ancak, lütfen alıntı yaptığınız paragrafın kaynağını listelemek için cevabınızı düzenler misiniz?
logc

Alıntı @logc kaynak burada ilk kelime, "Günlük" - link tarafından anılır - eğer tıklarsanız, Vikipedi makalesine getirecektir: en.wikipedia.org/wiki/Logfile
gnat

16

Buradaki çoğu cevap doğruluk yönüne odaklanır. Ancak, günlük kaydı da farklı bir amaca hizmet eder: Günlük, performansla ilgili verileri toplamanın bir yolu olabilir. Böylece sistem hatasız çalışıyor olsa bile, bir günlük neden yavaş olduğunu söyleyebilir. Test paketinin tüm yönleriyle tam olarak kapsanması durumunda bile bir test paketi anlatmaz.

Elbette, performans açısından kritik bir sistem bazı operasyonel panele kilit performans ölçümleri sağlayabilir / sağlamalıdır, ancak “klasik” kayıt farklı bir ayrıntı seviyesi sağlayabilir.


2
Ayrıca denetim takibi amaçları için kayıt tutmayı da unutmayın. Veya faturalandırma. Veya çeşitli istatistikler. Veya diğer sistemlerin diğer istatistik türleriyle eşleşmek için olay günlüğünü kaydedin.
PlazmaHH

Giriş yapmadan yapabileceğin bir şeyi profillemek değil mi? Yoksa sadece profil sonuçlarını sürekli olarak kaydedebileceğinizi mi kastediyorsunuz?
Bergi

@Bergi: tamamen uygulamanızın nasıl çalıştığına bağlıdır. Örneğin bir web uygulamasıysa, her isteğin hizmet zamanını günlüğe kaydetmek ve daha sonra bu olayları "kötü performans" için kümelemeye çalışmak da işe yarayabilir.
PlasmaHH

@Bergi profillemesi geliştirme aşamasında gerçekleşir, ancak akılda tutulması gereken canlı sistemler üzerinde etkileri vardır, disklerin kullanılması yavaşlayabilir, CPU daha fazla yüklenebilir, hizmetler zamanında yanıt vermeyebilir, paralel dişliler kilitleme sorunlarıyla karşılaşabilir ...
johannes

@PlasmaHH denetimi, temel gereksinimlerin bir parçasıdır ve testlerle kapsanması gerekir. Çoğu durumda onu "normal" günlük yollarından geçirmem. Normal günlük kaydı başarısız olabilir, denetim yapılmaz. "çeşitli istatistikler" Performans altında topladım;)
johannes

8

Asıl sorunuza kısa cevap: Genel bir kural olarak, kodunuzdaki hatalar TDD tarafından karşılanmayacaktır. Bazıları , ideal olarak birçoğu olabilir, ancak başarısız testlerin olmaması, böceklerin yokluğunu göstermez. Bu, yazılım testlerinde çok önemli bir maksimumdur.

Sisteminizde yanlış bir davranış olup olmayacağınızı bilemeyeceğinizden, belki de nadir şartlar altında, kayıt işlemi kaçınılmaz bir şekilde yanlış gittiğinde neyin yanlış olduğunu anlamanıza yardımcı olabilecek kullanışlı bir araçtır.

Günlük kaydı ve TDD farklı endişeleri ele almaktadır.


7
  1. % 100 test kapsamınız yoksa, genellikle durum böyle değildir, yazılımınızın asla çökmeyeceğini bilemezsiniz (EDIT: ve - yorumlarda belirtildiği gibi - olsa bile, yazılımınızdan bağımsız bir şey olabilir) Bir çarpışma); Bu kesinlikle hiçbir hataya sahip olmayan bir yazılım yapabileceğinizi düşünmekle aynıdır (NASA bile yapamaz). Dolayısıyla, en azından, programınızın çökmesi durumunda muhtemel arızaları kaydetmeniz gerekir, böylece nedenini öğrenebilirsiniz.

  2. Günlük, kullandığınız teknolojiye bağlı olarak harici bir kütüphane veya intern çerçeve tarafından yapılmalıdır. Bununla demek istediğim, daha önce test edilmiş bir şey olması ve kendinizi test etmeniz gerekmiyor. Her yöntemin olması gereken şeyleri kaydettiğini test etmek çok zor.

  3. Günlükler testler için uygun değildir, hiçbir bağımlılık olmamalıdır. Bununla birlikte, günlükler çevreye karşılık gelen bir dosyada saklanmalıdır (test, geliştirme ve üretim ortamı için farklı bir dosyaya sahip olmalısınız). en sonunda).

  4. Bir hata çok net olmayabilir ve bir TDD testi başarısız olduğunda neyin yanlış gittiği her zaman açık değildir. Günlükleri daha kesin olmalıdır. Örneğin, bir sıralama algoritması yapıyorsanız ve tüm test durumu başarısız olursa, algoritmanın her bir testi için sorunun gerçekte nerede olduğunu görmenize yardımcı olacak günlükler olmalıdır.


3
% 100 kapsama sahip olsanız bile, olabilecek her şey için sizde var mı? Veritabanınıza ağ bağlantısı kesilirse ne olur? Testlerin sana bunu söyleyecek mi?
Zachary K

% 100 kapsama alanına sahipseniz yazılımınızın EVEN'i asla çökmeyeceğini asla bilemezsiniz. % 100 kapsama, istendiği halde, doğruluk hakkında göründüğünden daha az bilgi verir.
Andres F.

Evet, bu konuda da haklısın. Mesele şu ki, çarpışma ihtimalinin olmaması mümkün değil. Düzenleyeceğim.
Pierre Arlaud

1
Düzenleme hala yanlış. % 100 test kapsamına sahip olsanız bile , kodunuzda bir hata olabilir (harici nedenleri suçlamanıza gerek yoktur). Sınamalar kod çalışmanızı gerektirmez; Herhangi bir kesinlikte ima ettikleri tek şey, hata bulan bir test yazamadığınızdır :) Test kapsamı önemli bir ölçümdür, ancak hataların olmaması ile doğrudan ilişkili değildir.
Andres F.

3
"Geçti% 100 test kapsamı! = Hatasız" olduğunu kanıtlamak çok önemlidir. Karşı örnek: add(x, y) = 2(her zaman 2 döndürür). Aşağıdaki test geçer ve tam güvence sağlıyor: assert(2 == add(1,1)). Buggy fonksiyonu için% 100 test kapsamı :)
Andres F.

5

Evet, genel durumda kayıtlara ihtiyacınız var.

Günlüğe kaydetme hata ayıklama ile ilgili değildir. Peki, tamam, günlüğe kaydetmenin bir parçası bazen hata ayıklama ile ilgilidir ve geliştirme sırasında ihtiyaç duymuyorsanız bu bölümü atlayabilirsiniz.

Ancak günlüğe kaydetmenin daha önemli kısmı sürdürülebilirlikle ilgilidir. İyi tasarlanmış bir günlük kaydı aşağıdaki soruları cevaplayabilir:

  • Uygulama hala hayatta ve tekmeliyor mu? (Her 1000 saniyede bir kalp atışı kaydederek.)
  • Uygulamanın performansı son 10 ayda değişti mi? (Kullanım durumlarının performans istatistiklerini günlüğe kaydederek.)
  • Başvurunun yükü son 10 ay boyunca değişti mi? (Her istek türü için istek sayısını kaydederek.)
  • Arayüzlerimizden herhangi biri performans özelliklerini değiştirdi mi?
  • Yeni sürüm, bazı alt sistemlere karşı farklı bir kullanım özelliği yaratıyor mu?
  • DoS saldırısı altında mıyız ?
  • Ne tür hatalar oluyor?

Bütün bunlar kayıt yaparak elde edilebilir. Ve evet, planlanmalı ve tasarlanmalı ve test edilmelidir, tercih edilen otomatik olmalıdır.

Günlük kaydı, tıpkı diğer özellikler gibi, tedaviyi hak eden bir özelliktir.


4

TL; DR: Günlüğe kaydetme ve TDD ortogonaldir. Birinin diğerine ihtiyaç duyması üzerinde hiçbir etkisi olmaması

TDD yapıyorsak giriş yapmamız gerekiyor mu? başarısız bir test uygulamada neyin yanlış olduğunu ortaya çıkarmaz?

Uyguladığım ve uyguladığım günlüğe kaydetme işlemlerinin çoğunda, geliştirme hata ayıklaması için değil (yardım edebilmesine rağmen) operasyonel sorun giderme çalışmaları yapıldı. Bu günlüğe kaydetmenin ana izleyici kitlesi, sunucularınızı yöneten yöneticiler ve op'lar, analiz için kendilerine gönderilen günlükleri destekleyen insanları ve günlüklere bakmak ve olanları araştırmak isteyen müşterilerdir.

Bu günlükler, büyük ölçüde entegrasyon noktalarına ilişkin sorunları gidermenize yardımcı olmak için vardır. Bu, ağ hizmetleri (veritabanı, sabun vb.), Yerel kaynaklar (disk, bellek vb.), Hatalı veriler (müşteri girişi, kötü / bozuk veri kaynakları, vb.) Vb. Olabilir (ayarlar, yapılandırmalar vb.) sorun gidermeye yardımcı olabilir.

Her sınıftaki her bir yöntemde günlük kaydı için test eklemeli miyiz?

Günlük kaydını test etmek için ihtiyaç duyduğunuz her yerde test ekleyin. Bilgileri kapatmak için özel aramalarınız varsa, o zaman test edilmelidirler. Yönelimli Programlama veya meta programlama kullanarak kayıt ve kayıt testi uygularsanız, bu testin yükünü azaltabilir.

Örneğin üretim ortamında bazı günlük seviyeleri devre dışı bırakılmışsa, bu testler ve çevre arasında bir bağımlılık getirmez mi?

Kodunuzu IoC kullanarak yazıyorsanız ve alaylardan yararlanıyorsanız, belirli bir çevre kurulumuna güvenmeden tüm kayıt işlemlerinizi etkin bir şekilde test edebilmelisiniz.


3

TDD genellikle kodlama hatalarını azaltmaya yardımcı olur. Spesifikasyondaki hatalarla veya işlerin nasıl yürüdüğü ile ilgili yanlış anlaşılmalar konusunda çok daha az yardımcı olur.

“Oh? Oturum açma işleminin başarılı olduğunu onaylamadan önce bir veri mesajı alabilirsiniz. Günlük kaydı, yazılımın ne yapmaya çalıştığını söylemek için çok kullanışlıdır, böylece yanlış yaptığınız şeyi tespit edebilirsiniz.


2

Tecrübelerime göre TDD yapmadığımız zaman uygulamaya büyük miktarda kayıt eklenir. Sonra belirsizlik seviyesi yükselir, bu yüzden neler olup bittiğini görmek için kayıt ekleriz.

Oysa TDD yaparken (ya da belki test yaparken) kendimi çok daha az log ifadesi ekleyerek buluyorum. Bu da daha az LOC anlamına gelir ve (her zaman değil) performansı etkileyebilir.

Ancak, çoğu durumda geliştirme yönteminden bağımsız olarak şirketimde işlevler için giriş çıkış günlüklerini yarı otomatik olarak ekliyoruz. Bildiğim kadarıyla bu üretim sorun analizi için zorunlu olarak kabul edildi.

Örnek, kamu arayüzünde mevcut olan bir EJB servis çekirdeğinin yöntemleri olabilir. Bir diğeri, bir fonksiyonun karmaşık hesaplamalar yaptığı bir durum olabilir. Yönteme giren rakamlara sahip olmak çok yardımcı olabilir (örneğin eldeki genel konuya geri dönmek için bir birim testi yazabilirsiniz).


Lütfen fonksiyonlar için neden giriş yapan günlükleri eklediniz? Bu neden şirketinizde gerekli?
gnat

Evet kesinlikle. umarım şimdi daha iyidir.
dbalakirev
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.