İyi Bir Birim Testi Yapan Nedir? [kapalı]


97

Eminim çoğunuz çok sayıda otomatik test yazıyorsunuzdur ve ayrıca birim testi yaparken bazı yaygın tuzaklarla karşılaşmışsınızdır.

Sorum şu: Gelecekte sorun yaşamamak için test yazarken herhangi bir davranış kuralına uyuyor musunuz? Daha spesifik olmak gerekirse: İyi birim testlerin özellikleri nelerdir veya testlerinizi nasıl yazarsınız?

Dilden bağımsız öneriler teşvik edilir.

Yanıtlar:


93

Kaynakları ekleyerek başlayayım - JUnit ile Java'da Pragmatik Birim Testi (C # -Nunit ile de bir sürüm var .. ama bende bu var .. çoğunlukla agnostik. Önerilir.)

İyi Testler BİR YOLCULUK olmalıdır (Kısaltma yeterince yapışkan değildir - bunu doğru anladığımdan emin olmak için kitapta çıkarmam gereken kopya kağıdının bir çıktısı var ..)

  • Otomatik : Testlerin çalıştırılması ve GEÇTİ / BAŞARISIZ sonuçlarının kontrol edilmesi otomatik olmalıdır
  • Kapsamlı : Kapsam; Hatalar koddaki belirli bölgeler etrafında kümelenme eğiliminde olsalar da, tüm önemli yolları ve senaryoları test ettiğinizden emin olun. Test edilmemiş bölgeleri bilmeniz gerekiyorsa araçları kullanın
  • Tekrarlanabilir : Testler her seferinde aynı sonuçları vermelidir .. her seferinde. Testler, kontrol edilemeyen parametrelere dayanmamalıdır.
  • Bağımsız : Çok önemli.
    • Testler bir seferde yalnızca bir şeyi test etmelidir . Hepsi tek bir özelliği / davranışı test ettikleri sürece birden fazla iddia uygundur. Bir test başarısız olduğunda, sorunun yerini tam olarak belirlemelidir.
    • Testler birbirine güvenmemelidir - İzole. Test yürütme sırası hakkında varsayım yok. Kurulumu / sökmeyi uygun şekilde kullanarak her testten önce 'temiz bir seçenek listesi' sağlayın
  • Profesyonel : Uzun vadede, üretim kadar çok test koduna sahip olacaksınız (daha fazla değilse), bu nedenle test kodunuz için aynı iyi tasarım standardını takip edin. İyi faktörlü yöntem-sınıfları, niyetleri ortaya çıkaran isimler, Yineleme yok, iyi isimlerle testler, vb.

  • İyi testler de Hızlı çalışır . yarım saniyeden fazla süren herhangi bir test .. üzerinde çalışılmalıdır. Bir çalışma için test paketi ne kadar uzun sürer .. o kadar az sıklıkta çalıştırılır. Geliştirici ne kadar fazla değişiklik olursa, koşular arasında gizlice girmeye çalışır .. eğer herhangi bir şey bozulursa .. hangi değişikliğin suçlu olduğunu anlamak daha uzun sürer.

2010-08 Güncellemesi:

  • Okunabilir : Bu, Profesyonel'in bir parçası olarak kabul edilebilir - ancak yeterince vurgulanamaz. Bir asit testi, ekibinizin bir parçası olmayan birini bulmak ve ondan test edilen davranışı birkaç dakika içinde anlamasını istemektir. Testlerin tıpkı üretim kodu gibi korunması gerekir - bu nedenle, daha fazla çaba gerektirse bile okumayı kolaylaştırın. Testler simetrik (bir model izleyin) ve kısa (her seferinde bir davranışı test edin) olmalıdır. Tutarlı bir adlandırma kuralı kullanın (ör. TestDox stili). Testi "tesadüfi detaylarla" karıştırmaktan kaçının .. minimalist olun.

Bunların dışında, diğerlerinin çoğu, düşük fayda sağlayan işleri azaltan yönergelerdir: örneğin, 'Sahip olmadığınız kodu test etmeyin' (örneğin, üçüncü taraf DLL'ler). Alıcıları ve ayarlayıcıları test etmeye devam etmeyin. Maliyet-fayda oranına veya kusur olasılığına dikkat edin.


Mocks'ın kullanımı konusunda fikir birliğine varamayabiliriz, ancak bu, birim testi en iyi uygulamalarının çok güzel bir yazısıydı.
Justin Standard

Bunu bir cevap olarak yükselteceğim, çünkü "A TRIP" kısaltmasını yararlı buluyorum.
Spoike

3
Çoğunlukla katılıyorum, ancak sahip olmadığınız kodu test etmenin bir faydası olduğunu belirtmek isterim ... Gereksinimlerinizi karşılayıp karşılamadığını test ediyorsunuz. Yükseltmenin sistemlerinizi bozmayacağından başka nasıl emin olabilirsiniz? (Ancak bunu yaparken elbette maliyet / fayda oranlarını aklınızda bulundurun.)
hayal kırıklığına uğramış

@Craig - Bağlı olduğunuz davranışı belgeleyen (arayüz seviyesi) regresyon testlerinden (veya bazı durumlarda öğrenci testlerinden) bahsettiğinizi düşünüyorum. Üçüncü taraf kodu için 'birim' testleri yazmam çünkü a. satıcı bu kod hakkında benden daha fazla şey biliyor b. Satıcı, herhangi bir özel uygulamayı korumak zorunda değildir. Bu kod tabanındaki değişikliği kontrol etmiyorum ve zamanımı bozuk testleri bir yükseltme ile düzeltmek için harcamak istemiyorum. Daha doğrusu kodu kullandığım bu davranışı için bazı üst düzey regresyon testlerinde kadar (kırık ne zaman ve istediğiniz haberdar olmak için) olurdu Yani
Gishu

@Gishu: Evet, kesinlikle! Testler yalnızca arayüz seviyesinde yapılmalıdır; ve aslında, gerçekten kullandığınız özellikleri test etmelisiniz. Ayrıca bu testleri ne yazacağınıza karar verirken; Basit ve anlaşılır 'birim' test çerçevelerinin genellikle faturaya tam olarak uyduğunu buldum.
Hayal kırıklığına uğramış

42
  1. Devasa testler yazma. Birim testindeki 'birim'in önerdiği gibi, her birini atomik ve olabildiğince izole yapın . Gerekirse, tipik kullanıcı ortamının çoğunu manuel olarak yeniden oluşturmak yerine, sahte nesneler kullanarak ön koşullar oluşturun.
  2. Açıkça işe yarayan şeyleri test etmeyin. Sınıfları, özellikle kodladığınız çerçevenin temel API'lerini sağlayan üçüncü taraf satıcıdan test etmekten kaçının. Örneğin, satıcının Hashtable sınıfına bir öğe eklemeyi test etmeyin.
  3. Henüz test etmemiş olduğunuz uç durumları keşfetmenize yardımcı olması için NCover gibi bir kod kapsama aracı kullanmayı düşünün .
  4. Uygulamadan önce testi yazmayı deneyin . Testi, uygulamanızın uyacağı bir özellik olarak düşünün. Cf. ayrıca davranış odaklı geliştirme, daha spesifik bir test odaklı geliştirme dalı.
  5. Tutarlı olun. Yalnızca kodunuzun bir kısmı için testler yazarsanız, pek kullanışlı olmaz. Bir takımda çalışıyorsanız ve diğerlerinin bir kısmı veya tamamı test yazmıyorsa, bu da pek yararlı değildir. Kendinizi ve diğer herkesi bunun önemi konusunda ikna edin (ve zaman tasarrufu test özellikler) konusunda veya zahmet etmeyin.

1
İyi cevap. Ancak bir teslimattaki her şey için birim testi yapmazsanız o kadar da kötü değil. Elbette tercih edilir, ancak bir denge ve pragmatizm olması gerekir. Re: meslektaşlarınızı gemiye almak; bazen sadece değeri göstermek ve referans noktası olarak bunu yapmanız gerekir.
Martin Clarke

1
Katılıyorum. Bununla birlikte, uzun vadede, testlerin orada olduğuna güvenebilmelisiniz, yani ortak tuzakların onlar tarafından yakalanacağını varsayabilmelisiniz. Aksi takdirde, faydalar büyük ölçüde azalır.
Sören Kuklau

2
"Yalnızca kodunuz için testler yazarsanız, pek kullanışlı olmaz." Durum gerçekten bu mu? % 20 kod kapsamına sahip projelerim var (kritik / başarısız alanlar) ve bana çok yardımcı oldular ve projeler de gayet iyi.
dr. evil

1
Slough'a katılıyorum. Yalnızca birkaç test olsa bile, yeterince iyi yazıldıkları ve yeterince izole edildikleri için, çok yardımcı olacaklardır.
Spoike

41

Buradaki cevapların çoğu, testleri kendileri (nasıl) yazmaktan ziyade, genel olarak birim testi en iyi uygulamalarını (ne zaman, nerede, neden ve ne) ele alıyor gibi görünüyor. Soru "nasıl" bölümünde oldukça spesifik göründüğünden, bunu şirketimde yaptığım "kahverengi çanta" sunumundan alarak yayınlayacağımı düşündüm.

Womp'un 5 Yazma Testi Yasası:


1. Uzun, açıklayıcı test yöntemi adları kullanın.

   - Map_DefaultConstructorShouldCreateEmptyGisMap()
   - ShouldAlwaysDelegateXMLCorrectlyToTheCustomHandlers()
   - Dog_Object_Should_Eat_Homework_Object_When_Hungry()

2. Testlerinizi bir Düzenleme / Harekete Geçme / Onaylama tarzında yazın .

  • Bu örgütsel strateji bir süredir ortalıkta dolaşıp pek çok şey ifade etse de, son zamanlarda "AAA" kısaltmasının tanıtılması, bunu aşmak için harika bir yol oldu. Tüm testlerinizi AAA stiliyle tutarlı hale getirmek, onları okumayı ve sürdürmeyi kolaylaştırır.

3. Onaylarınızla her zaman bir hata mesajı sağlayın.

Assert.That(x == 2 && y == 2, "An incorrect number of begin/end element 
processing events was raised by the XElementSerializer");
  • Koşucu uygulamanızda neyin başarısız olduğunu açıkça gösteren basit ama ödüllendirici bir uygulama. Bir mesaj vermezseniz, başarısızlık çıktınızda genellikle "Doğru olması bekleniyordu, yanlıştı" gibi bir şey görürsünüz, bu da neyin yanlış olduğunu bulmak için gerçekten testi okumanıza neden olur.

4. Testin nedenini yorumlayın - iş varsayımı nedir?

  /// A layer cannot be constructed with a null gisLayer, as every function 
  /// in the Layer class assumes that a valid gisLayer is present.
  [Test]
  public void ShouldNotAllowConstructionWithANullGisLayer()
  {
  }
  • Bu açık görünebilir, ancak bu uygulama testlerinizin bütünlüğünü ilk etapta testin arkasındaki nedeni anlamayan kişilerden koruyacaktır. Tamamen iyi olan birçok testin kaldırıldığını veya değiştirildiğini gördüm, çünkü kişi testin doğruladığı varsayımlarını anlamadı.
  • Test önemsizse veya yöntem adı yeterince açıklayıcıysa, yorumun kapalı bırakılmasına izin verilebilir.

5. Her test, dokunduğu herhangi bir kaynağın durumunu daima geri döndürmelidir

  • Gerçek kaynaklarla uğraşmaktan kaçınmak için mümkün olduğunca taklitler kullanın.
  • Temizleme test seviyesinde yapılmalıdır. Testler, uygulama sırasına bağlı olmamalıdır.

2
1., 2. ve 5. nokta nedeniyle +1 önemlidir. Tanımlayıcı test yöntemi adlarını zaten kullanıyorsanız, 3 ve 4 birim testleri için oldukça fazla görünmektedir, ancak kapsamları büyükse (işlevsel veya kabul testi) testlerin dokümantasyonunu tavsiye ederim.
Spoike

Pratik ve pratik bilgi ve örnekler için +1
Phil

17

Bu hedefleri aklınızda bulundurun (Meszaros'un xUnit Test Patterns kitabından uyarlanmıştır)

  • Testler riski azaltmalı, ortaya çıkarmamalı.
  • Testlerin çalıştırılması kolay olmalıdır.
  • Sistem etraflarında geliştikçe testlerin bakımı kolay olmalıdır

Bunu kolaylaştıracak bazı şeyler:

  • Testler yalnızca bir nedenden dolayı başarısız olmalıdır.
  • Testler yalnızca bir şeyi test etmelidir
  • Test bağımlılıklarını en aza indirin (veri tabanlarına, dosyalara, kullanıcı arayüzüne vb. Bağımlılık yok)

XUnit çerçevenizle de entegrasyon testi yapabileceğinizi unutmayın, ancak entegrasyon testleri ile birim testlerini ayrı tutun


Sanırım Gerard Meszaros'un "xUnit Test Patterns" kitabından uyarladığınızı kastettiniz. xunitpatterns.com
Spoike

Evet, haklısın. Bunu
gönderide açıklayacağım

Mükemmel noktalar. Birim testleri çok yararlı olabilir, ancak sistemi değiştirme girişimleri için büyük bir vergi oluşturan karmaşık, birbirine bağlı birim testlerine sahip olma tuzağına düşmekten kaçınmak çok önemlidir.
Kama

9

Testler izole edilmelidir. Bir test diğerine bağlı olmamalıdır. Dahası, bir test harici sistemlere dayanmamalıdır. Diğer bir deyişle, test etmek için kod değil, kod kod on.You sizin entegrasyonu veya fonksiyonel testlerin bir parçası olarak bu etkileşimleri test edebilirsiniz bağlıdır.


9

Harika birim testlerinin bazı özellikleri:

  • Bir test başarısız olduğunda, sorunun nerede olduğu hemen anlaşılmalıdır. Sorunu izlemek için hata ayıklayıcıyı kullanmanız gerekiyorsa, testleriniz yeterince ayrıntılı değildir. Test başına tam olarak bir iddianın olması burada yardımcı olur.

  • Yeniden düzenleme yaptığınızda, hiçbir test başarısız olmamalıdır.

  • Testler o kadar hızlı çalışmalıdır ki, onları çalıştırmaktan asla çekinmezsiniz.

  • Tüm testler her zaman geçmelidir; deterministik olmayan sonuç yok.

  • Birim testleri, tıpkı üretim kodunuz gibi iyi faktörlendirilmelidir.

@Alotor: Bir kitaplığın yalnızca harici API'sinde birim testleri olması gerektiğini öneriyorsanız, katılmıyorum. Dışarıdan arayanlara göstermediğim sınıflar da dahil olmak üzere her sınıf için birim testleri istiyorum. (Bununla birlikte, özel yöntemler için testler yazma ihtiyacı hissediyorsam, o zaman yeniden düzenleme yapmam gerekir. )


DÜZENLEME: "Test başına bir değerlendirme" nin neden olduğu yinelemeyle ilgili bir yorum vardı. Spesifik olarak, bir senaryo oluşturmak için bir kodunuz varsa ve daha sonra bununla ilgili birden çok iddiada bulunmak istiyorsanız, ancak test başına yalnızca bir iddianız varsa, kurulumu birden çok testte çoğaltabilirsiniz.

Ben bu yaklaşımı benimsemiyorum. Bunun yerine, senaryo başına test fikstürleri kullanıyorum . İşte kaba bir örnek:

[TestFixture]
public class StackTests
{
    [TestFixture]
    public class EmptyTests
    {
        Stack<int> _stack;

        [TestSetup]
        public void TestSetup()
        {
            _stack = new Stack<int>();
        }

        [TestMethod]
        [ExpectedException (typeof(Exception))]
        public void PopFails()
        {
            _stack.Pop();
        }

        [TestMethod]
        public void IsEmpty()
        {
            Assert(_stack.IsEmpty());
        }
    }

    [TestFixture]
    public class PushedOneTests
    {
        Stack<int> _stack;

        [TestSetup]
        public void TestSetup()
        {
            _stack = new Stack<int>();
            _stack.Push(7);
        }

        // Tests for one item on the stack...
    }
}

Test başına yalnızca bir iddia konusunda hemfikir değilim. Bir testte ne kadar çok iddianız varsa, o kadar az kesme ve yapıştırma test senaryosu elde edersiniz. Bir test senaryosunun bir senaryoya veya kod yoluna odaklanması gerektiğine ve bu senaryoyu yerine getirmek için iddiaların tüm varsayımlardan ve gereksinimlerden kaynaklanması gerektiğine inanıyorum.
Lucas B

DRY'nin birim testleri için geçerli olduğunu kabul ettiğimizi düşünüyorum. Dediğim gibi, "Birim testleri iyi faktörlendirilmelidir". Ancak, çoğaltmayı çözmenin birçok yolu vardır. Birincisi, bahsettiğiniz gibi, önce test edilen kodu çağıran ve ardından birden çok kez onaylayan bir birim testine sahip olmaktır. Bir alternatif, senaryo için, bir Başlatma / Kurulum adımı sırasında test edilen kodu çağıran ve daha sonra basitçe iddia eden bir dizi birim testine sahip olan yeni bir "test fikstürü" oluşturmaktır.
Jay Bazuzi

Genel kuralım, kopyala-yapıştır kullanıyorsanız, yanlış bir şey yapıyorsunuzdur. En sevdiğim sözlerden biri "Kopyala-yapıştır bir tasarım kalıbı değildir." Ayrıca birim test başına bir iddianın genellikle iyi bir fikir olduğuna katılıyorum, ancak bunda her zaman ısrar etmiyorum. Daha genel olan "birim test başına bir şey test etme" yi seviyorum. Yine de bu genellikle birim test başına bir iddia anlamına gelir.
Jon Turner

7

Peşinde olduğunuz şey, test edilen sınıfın davranışlarının tasviridir.

  1. Beklenen davranışların doğrulanması.
  2. Hata durumlarının doğrulanması.
  3. Sınıf içindeki tüm kod yollarının kapsamı.
  4. Sınıftaki tüm üye işlevlerini uygulamak.

Temel amaç, sınıfın davranışına olan güveninizi artırmaktır.

Bu, özellikle kodunuzu yeniden düzenlemeye bakarken yararlıdır. Martin Fowler'ın ilginç bir makalesi var web sitesinde testlerle ilgili .

HTH.

şerefe

Rob


Rob - mekanik bu iyi, ancak amacı kaçırıyor. Bütün bunları neden yaptın? Bu şekilde düşünmek, başkalarına TDD yolunda yardımcı olabilir.
Mark Levison

7

Test başlangıçta başarısız olmalıdır. O zaman onları geçmesini sağlayan kodu yazmalısınız, aksi takdirde hatalı ve her zaman başarılı olan bir test yazma riskiyle karşı karşıya kalırsınız.


@Rismo Münhasır değildir. Tanımı gereği Quarrelsome'un burada yazdıkları, TDD'nin bir parçası olan "Önce Test Et" metodolojisine özeldir. TDD ayrıca yeniden düzenlemeyi de hesaba katar. Okuduğum en "akıllı pantolon" tanımı, TDD = Test First + Refactor.
Spoike

Evet, TDD olmak zorunda değil, sadece testinizin önce başarısız olduğundan emin olun. Sonra geri kalanını daha sonra bağlayın. Bu, genellikle TDD yaparken meydana gelir, ancak TDD'yi kullanmadığınızda da uygulayabilirsiniz.
Quibblesome

6

Yukarıda bahsedilen Pragmatik Birim Testi kitabındaki Sağ BICEP kısaltmasını beğendim :

  • Doğru : Sonuçlar doğru mu?
  • B : Tüm b oundary koşullar doğru mu?
  • Ben : Biz kontrol edebilir i ilişkileri nverse?
  • C : Biz Can c ross-çek sonuçları diğer araçları kullanarak?
  • E : Biz zorlayabilir miyim e gerçekleşmesi rror koşullarını?
  • P : Are p sınırları içinde performansı alabilirsiniz karakteristikleri?

Şahsen, doğru sonuçları aldığınızı kontrol ederek (1 + 1, bir toplama işlevinde 2 döndürmelidir), aklınıza gelebilecek tüm sınır koşullarını deneyerek (toplamı olan iki sayıyı kullanmak gibi) oldukça ileriye gidebileceğinizi düşünüyorum. add işlevindeki maksimum tamsayı değerinden daha büyüktür) ve ağ hataları gibi hata koşullarını zorlar.


6

İyi testlerin sürdürülebilir olması gerekir.

Karmaşık ortamlar için bunu nasıl yapacağımı tam olarak çözmedim.

Kod tabanınız yüz binlerce veya milyonlarca satır koda ulaşmaya başladığında tüm ders kitapları tutarsız gelmeye başlar.

  • Takım etkileşimleri patlıyor
  • patlayan test senaryolarının sayısı
  • bileşenler arasındaki etkileşimler patlar.
  • Tüm birim testlerini oluşturma zamanı, derleme süresinin önemli bir parçası olur
  • API değişikliği yüzlerce test senaryosuna yayılabilir. Üretim kodu değişikliği kolay olsa da.
  • İşlemleri doğru duruma sıralamak için gereken olay sayısı artar ve bu da test yürütme süresini artırır.

İyi mimari, etkileşim patlamasının bir kısmını kontrol edebilir, ancak kaçınılmaz olarak sistemler daha karmaşık hale geldikçe, otomatik test sistemi de onunla birlikte büyür.

İşte değiş tokuşlarla uğraşmaya başladığınız yer:

  • yalnızca harici API'yi test edin, aksi takdirde dahili öğeleri yeniden düzenlemek önemli test senaryosu yeniden çalışmasına neden olur.
  • Kapsüllenmiş bir alt sistem daha fazla durumu koruduğundan, her testin kurulumu ve sökülmesi daha karmaşık hale gelir.
  • her gece derleme ve otomatik test yürütme saatlere kadar büyür.
  • artan derleme ve yürütme süreleri, tasarımcıların tüm testleri çalıştırmadığı veya yapmayacağı anlamına gelir
  • Test yürütme sürelerini azaltmak için, kurulum ve sökümleri azaltmak için testleri sıralamayı düşünürsünüz

Ayrıca karar vermeniz gerekiyor:

test durumlarını kod tabanınızda nerede saklıyorsunuz?

  • test senaryolarınızı nasıl belgeliyorsunuz?
  • Test armatürleri, test senaryosu bakımından tasarruf etmek için yeniden kullanılabilir mi?
  • her gece yapılan bir test senaryosu yürütmesi başarısız olursa ne olur? Triyajı kim yapar?
  • Sahte nesneleri nasıl korursunuz? 20 modülünüz varsa, tümü kendi sahte günlük API'sini kullanan, API dalgalarını hızla değiştirir. Sadece test senaryoları değil, 20 sahte nesne de değişir. Bu 20 modül, birçok farklı ekip tarafından birkaç yıl boyunca yazılmıştır. Klasik bir yeniden kullanım problemi.
  • bireyler ve ekipleri otomatik testlerin değerini anlarlar ve diğer ekibin bunu nasıl yaptığını beğenmezler. :-)

Sonsuza kadar devam edebilirim, ama benim açımdan şu:

Testlerin sürdürülebilir olması gerekir.


5

Bu ilkeleri , herhangi bir geliştirici için okumasının önemli olduğunu düşündüğüm Bu MSDN Magazine makalesinde bir süre önce ele almıştım.

"İyi" birim testlerini tanımlama yöntemim, aşağıdaki üç özelliğe sahip olmalarıdır:

  • Okunabilir (adlandırma, iddialar, değişkenler, uzunluk, karmaşıklık ..)
  • Sürdürülebilirdirler (mantık yok, fazla belirtilmemiş, duruma dayalı, yeniden düzenlenmiş ..)
  • Güvene değerdirler (entegrasyon testleri değil, doğru olanı test edin.)

Roy, tüm kalbimle katılıyorum. Bunlar, son durum kapsamından çok daha önemlidir.
Matt Hinze

güvene layık - mükemmel nokta!
ratkok

4
  • Birim Testi yalnızca Biriminizin harici API'sini test eder, dahili davranışı test etmemelisiniz.
  • Bir TestCase'in her bir testi, bu API içindeki bir (ve yalnızca bir) yöntemi test etmelidir.
    • Başarısızlık durumları için Ek Test Durumları dahil edilmelidir.
  • Testlerinizin kapsamını test edin: Bir ünite test edildikten sonra, bu ünite içindeki hatların% 100'ü yürütülmüş olmalıdır.

2

Jay Fields'ın birim testleri yazma konusunda pek çok iyi tavsiyesi var ve en önemli tavsiyeleri özetlediği bir yazı var . Orada, bağlamınız hakkında eleştirel bir şekilde düşünmeniz ve tavsiyenin sizin için değer olup olmadığına karar vermeniz gerektiğini okuyacaksınız. Burada bir sürü harika yanıt alırsınız, ancak bağlamınız için hangisinin en iyi olduğuna karar vermek size kalmış. Onları deneyin ve size kötü kokuyorsa yeniden düzenleme yapın.

Saygılarımla


1

Asla önemsiz bir 2 satır yönteminin işe yarayacağını varsaymayın. Hızlı bir birim testi yazmak, eksik sıfır testinin, yanlış yerleştirilmiş eksi işaretinin ve / veya ince kapsam hatasının sizi ısırmasını önlemenin tek yoludur, kaçınılmaz olarak bununla şimdi olduğundan daha az zamanınız olduğunda.


1

"A TRIP" cevabını ikinci olarak veriyorum, ancak testlerin birbirine güvenmesi GEREKİR !!!

Neden?

KURU - Kendini Tekrar Etme - test için de geçerlidir! Test bağımlılıkları 1) kurulum süresinden tasarruf etmenize, 2) fikstür kaynaklarından tasarruf etmenize ve 3) arızaların yerini belirlemenize yardımcı olabilir. Elbette, yalnızca test çerçevenizin birinci sınıf bağımlılıkları desteklediği göz önüne alındığında. Aksi takdirde, kabul ediyorum, kötüler.

Http://www.iam.unibe.ch/~scg/Research/JExample/ adresini takip edin


Sana katılıyorum. TestNG, bağımlılıklara kolayca izin verilen başka bir çerçevedir.
Davide

0

Genellikle birim testleri, sahte nesneye veya sahte verilere dayanır. Üç tür birim testi yazmayı seviyorum:

  • "geçici" birim testleri: kendi sahte nesnelerini / verilerini oluştururlar ve bununla işlevlerini test ederler, ancak her şeyi yok ederler ve hiçbir iz bırakmazlar (bir test veritabanında veri olmaması gibi)
  • "kalıcı" birim testi: Kodunuzdaki işlevleri test ederler ve daha sonra kendi birim testleri için daha gelişmiş işlevler tarafından ihtiyaç duyulacak nesneler / veriler oluştururlar (bu gelişmiş işlevlerin her seferinde kendi sahte nesne / veri setlerini yeniden oluşturmasını önler)
  • "Kalıcı temelli" birim testleri: kalıcı birim testleri tarafından zaten mevcut olan (başka bir birim test oturumunda yaratıldığı için) sahte nesneleri / verileri kullanan birim testleri.

Önemli olan, her işlevi test edebilmek için her şeyi yeniden oynatmaktan kaçınmaktır .

  • Üçüncü türü çok sık çalıştırırım çünkü tüm sahte nesneler / veriler zaten oradadır.
  • Modelim her değiştiğinde ikinci türü çalıştırırım.
  • Temel regresyonları kontrol etmek için arada bir çok temel işlevleri kontrol etmek için ilkini çalıştırıyorum.

0

2 tür testi düşünün ve bunları farklı şekilde ele alın - işlevsel test ve performans testi.

Her biri için farklı girdi ve metrikler kullanın. Her test türü için farklı bir yazılım kullanmanız gerekebilir.


Peki ya birim testi?
Spoike

0

Roy Osherove'un Birim Testi Adlandırma standartları tarafından açıklanan tutarlı bir test adlandırma kuralı kullanıyorum Belirli bir test senaryosu sınıfındaki her yöntem aşağıdaki adlandırma stiline sahiptir MethodUnderTest_Scenario_ExpectedResult.

    İlk test adı bölümü, test edilen sistemdeki yöntemin adıdır.
    Sırada, test edilmekte olan özel senaryo var.
    Son olarak bu senaryonun sonuçları.

Her bölüm Üst Deve Durumunu kullanır ve bir alt puanla sınırlandırılmıştır.

Testi çalıştırdığımda bunu faydalı buldum, test, test edilen yöntemin adına göre gruplandırılır. Ve bir konvansiyona sahip olmak, diğer geliştiricilerin test amacını anlamasını sağlar.

Ayrıca, test edilen yöntem aşırı yüklenmişse, Yöntem adına parametreler eklerim.

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.