Birim testi acemi için birim testleri en iyi yöntemler


29

Son yıllarda, büyük projelerdeki veya küçük araçlardaki insanlar için sadece küçük parçalar yazdım. Asla bir ünite testi yazmadım ve her zaman nasıl yazılacağını öğrenmek gibi görünüyor ve bir program yapmak, programı başlatmak ve gerçek testlerden çok daha uzun sürüyor.

Tamamlanması birkaç ay alabilen oldukça büyük ölçekli bir projeye başlamak üzereyim ve elemanları yazarken (her zamanki gibi) test etmeye çalışacak olsam da, birim testinin zaman kazanıp kazanamayacağını merak ediyorum.

Sadece birisinin iyi bir tavsiyede bulunabileceğini merak ediyordum

  1. Proje başlangıcında birim testine bakmalı ve muhtemelen TDD yaklaşımını benimsemeli miyim?
  2. Her bölüm tamamlandıktan sonra devam ederken testler yazmalı mıyım?
  3. Projeyi tamamlamalı ve sonunda birim testlerini yazmalı mıyım?



Yanıtlar:


29

Bazıları aksini söyleyecektir, ancak TDD ve Birim Testini ayırmanızı öneririm. TDD oldukça zihinsel bir kaymadır ve başlangıçta zaman alan birim testi görünür. Onları tek bir ürün olarak görüyorsanız, derhal yeterince fayda görmeme riski vardır ve TDD'yi ve Ünite Testini bununla birlikte bırakma konusunda bir cazibe olacaktır.

İlk olarak, bazı Birim Testleri yazmaktır. İlk başta mükemmel olmaları gerekmez. Küçük kod birimlerini nasıl test edeceğinizi ve bileşenleri izole etmek için alaycı nasıl kullanacağınızı öğretin.

Bu en büyük zaman alıcı ama en büyük kazancı var. Test etmek istediğinize ulaşmak için artık 14 web sayfasını taramanız gerekmediğini fark ettiğinizde, neden bahsettiğimi anlayacaksınız.

Benim için, büyük Eureka anı, ulaşmadan önce iki form doldurmamı gerektiren bir regex test etmeye çalıştığım bir Windows uygulamasıydı. NUnit'i yükledim ve bu yönteme bir test yazdım ve saatlerce test süresinden ne kadar çabuk tasarruf ettiğimi gördüm. Sonra son vakalarla başa çıkmak için daha fazla test ekledim. Ve bunun gibi.

Ardından, birim testleri iyi yazmayı öğrenin. Pek çok bireysel testi yazmak ve yazmak için hızlı olan kırılgan testler arasındaki dengeyi öğrenin. Bu oldukça kolaydır. Ders, ideal olarak her test sadece bir şeyi test eder, ancak ne kadar sürdüğünü hızlı bir şekilde öğrenirsiniz, böylece her kod değişikliğini kıran bir test yazana kadar kural üzerinde biraz bükülmeye başlarsınız, sonra doğru dengeye geri dönersiniz. (ikincisinden daha yakın olan).

TDD, dediğim gibi, çalışma şeklinizdeki büyük bir zihinsel değişimdir. Ancak, zaten zaten testler yazdığınızda, geliştirme sürecinize zaman kazandırmayacaktır. Ve söz veriyorum, kodlama tarzınızın, gözlerinizin önünde geliştiğini göreceksiniz. Ya da daha sonra düşürmezseniz, bu sizin için değildir.

Akılda tutulması gereken son şey TDD'nin birim testleriyle sınırlı olmamasıdır. Kabul testine dayalı tasarım her bit TDD'nin bir parçasıdır. Onları zihninde karıştırmamak için bir başka iyi sebep.


+1 Teşekkürler - Başka cevaplar olması durumunda bir süre açık kalıyorum, ancak bu projenin aynı gerekçelerle benim için dönüm noktası olacağını düşünüyorum - birden fazla web sayfası ve manuel olarak test etmek daha uzun sürecek.
wilhil

@pdr "birim testleri iyi yazma" konusunda çalışabileceğim referanslarım var mı?
Gaston

9

Diğerleriyle aynı fikirdeyim (kesinlikle testlerinizi sonunda yazmayın, TDD'nin öğrenmesi zaman alır, test etmeye başlar ancak sonunda TDD'yi hedefleyebilirsiniz). Ancak yorumunuza cevap olarak bir şey eklemek istedim: "Ünite testinin zaman kazanıp kazanamayacağını merak ediyorum."

Cevabım kesin bir evet. TDD yaklaşımını yaklaşık 10 yıl önce, testler olmadan benzer bir süre kodladıktan sonra öğrendim. Bugünlerde kısa (<250 loc) ve basit veya atılmış bir şey yapıyorum, o zaman TDD yapmayacağım. Aksi takdirde, yaparım ve tam olarak zaman kazandırır.

Zaman tasarrufu üç şekilde gerçekleşir: daha az WTF, daha az hata ayıklama ve daha az korku. İlki açıktır: Yaptığınız şeyin ne halt ettiğini merak ederek çok daha az zaman harcıyorsunuz. Bir sorununuz olduğunda, hata ayıklama çok daha kolaydır, çünkü a) test edilmiş böcekleri anında yakalar ve b) denenmemiş böceklerin saklanacak daha az yeri vardır.

Daha az korku şey olsa da, daha ince. Bir TDD kod tabanında bir süre geçirene kadar, yaptığınız değişiklikler için ne kadar zaman harcadığınızı bile bilmiyorsunuz. X çalışıyor mu? Y'yi kıracak mı? Etkilenebilecek bir miktar Z var mı? TDD ile, bu ortadan kaybolur, çünkü korkularınızı testlere dönüştürürsünüz ve sonra bilgisayar endişelenmeyi otomatikleştirir. Bir cesur geliştirici daha hızlı bir geliştiricidir.


1
Daha az korku için +1. Ve bu hafta testsiz bir kod temeli geliştiriyordum. . .
Wyatt Barnett

2
Mükemmel alıntı: "korkularını sınava dönüştürürsün, sonra bilgisayar endişelenmeyi otomatikleştirir"!
RichVel

5
  1. Başlangıçta birime bakmalı ve TDD yaklaşımını benimsemeli miyim.

  2. Her bölüm tamamlandıktan sonra devam ederken testler yazmalı mıyım?

Bunlardan herhangi biri, ancak üçüncü seçenek değil .

@Pdr'nin belirttiği gibi, uygun birim testi öğrenmek zaman alıyor. Proje yaşam döngüsünün başlangıcında, son teslim tarihinin başınızın üzerinde döndüğü yere kadar değil, öğrenmek için zaman ayırmak istersiniz. Bu yolla zaten hız kazanmış olursunuz ve proje yaşam döngüsünde daha önce bulunan böceklerin çoğunu yakalamış olmanız nedeniyle, son başvuru tarihi yaklaşıncaya kadar avantajlara ulaşmaya bile başlayabilirsiniz.

İlk birim testinin her zaman en zor olduğunu unutmayın, özellikle de önceden yazılmış kodları kullanıyorsanız. Bu kod birim test dostu olmayabilir, bu nedenle test için uygun durumdaki tüm nesneleri kablolamakta zorlanabilirsiniz. Böylece, ilk birim test denemeleriniz için kolay, oldukça yalıtılmış, düşük seviyeli bir test seçin, ardından kademeli olarak zorluk seviyesini artırabilirsiniz. İlk test fikstürünü hazırladığınızda, bir sonraki test durumu çok daha kolaydır ve dördüncü seviyeye geldiğinizde konveyör bandında olduğu gibi test senaryoları üreteceksiniz. O zaman tekrar edilebilecek olmanın iyiliğini hissetmeye başladığınızda, bariz bir şekilde kodunuzun çalıştığını kanıtlayın ...

Şahsen TDD yaklaşımını tercih ediyorum ve bunun zor olduğunu düşünmüyorum - bu sebat ediyor, ancak TDD ile ne kadar erken başlarsanız ünite testinin yararlarını ne kadar erken görmeye başlarsanız inanıyorum. Bununla birlikte, ilk birkaç birim testinin zaten sahip olduğunuz kod için yazmak daha iyi olabilir. Ardından bir kere kapıldığınızda TDD ile denemeye başlayabilirsiniz.


Sanırım sizin ve PDR’nın tavsiyelerine dayanarak ikinci seçeneğe gideceğim - üçüncü seçenek için, gerçekten el ile test yapmak ve sonunda her şeyin olması gerektiği gibi olmasını sağlamak için bir test yazmak istiyordum. Gelecekte herhangi bir değişiklik olup olmadığını test etmeyin.
wilhil

2

Bence yeni başlayanlar için yapılacak en iyi şey, kendilerini birim testlerine ödünç veren bazı kod katalarla mücadele etmek. Örneğin; Bir e-posta adresini doğrulamak. TDD, bu Kod Kataşların birkaçını ele aldığınızda doğal akış haline gelir. Bahsettiğim e-posta adresi doğrulayıcısı için aşağıdaki kata kodunu inceleyin: E-posta Doğrulayıcı

Kod Katas'ın sizin için ne anlama geldiğini öğrenmek için aşağıdaki bağlantıya göz atın: Kod Katas

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.