Birim testinden geçmek için minimum kodu yazmak - hile yapmadan!


36

TDD yaparken ve bir birim testi yazarken, test ettiğiniz "uygulama" kodunun ilk yinelemesini yazarken "hile yapma" dürtüsüne nasıl karşı çıkılır?

Örneğin:
Bir sayının Faktörünü hesaplayalım. Birim testiyle başladım (MSTest kullanarak).

[TestClass]
public class CalculateFactorialTests
{
    [TestMethod]
    public void CalculateFactorial_5_input_returns_120()
    {
        // Arrange
        var myMath = new MyMath();
        // Act
        long output = myMath.CalculateFactorial(5);
        // Assert
        Assert.AreEqual(120, output);
    }
}

Bu kodu çalıştırıyorum ve CalculateFactorialmetot bile olmadığından başarısız oluyor . Bu yüzden, test edilen yöntemi uygulamak için kodu ilk kez tekrarlıyorum ve testi geçmek için gereken minimum kodu yazıyorum .

Mesele şu, sürekli olarak aşağıdakileri yazmaya teşvik ediyorum:

public class MyMath
{
    public long CalculateFactorial(long input)
    {
        return 120;
    }
}

Bu teknik olarak doğrudur, çünkü gerçekten belirli bir test geçişi yapmak için gereken minimum koddur (yeşile döner), ancak açıkça bir "hile" olmasına rağmen, gerçekten bir faktoring hesaplama işlevini gerçekleştirmeye çalışmadığı için. Tabii ki, şimdi yeniden düzenleme bölümü, uygulamanın gerçek bir yeniden yapılandırması yerine, "doğru işlevi yazma" konusunda bir alıştırma haline geliyor. Açıkçası, farklı parametrelere sahip ilave testler eklemek başarısız olur ve yeniden yönlendirmeye zorlar, ancak bu testle başlamanız gerekir.

Öyleyse, benim sorum şu, hala sınamak için asgari kodu yazmakla birlikte gerçekten işlevsel tutmaya devam ederken, gerçekten başarmaya çalıştığınız şeyin ruhunda "denemek için minimum kodu yazmak" arasındaki dengeyi nasıl elde edersiniz?


4
Bu insanca bir şey: hile yapma dürtüsüne direnmelisin. Bundan başka bir şey yok. Test etmek için koddan daha fazla test ekleyebilir ve koddan daha fazla test kodu yazabilirsiniz, ancak o kadar lüks bir şeye sahip değilseniz, sadece direnmeniz gerekecek. Kodlamada korsanlık veya hile yapma dürtüsüne karşı koyacağımız yer olan ÇOK yerler var, çünkü biliyoruz ki, bugün çalışabilirken daha sonra işe yaramayacak.
Dan Rosenstark

7
Şüphesiz, TDD'de, onu tersi yönde yapmak hile yapmaktır - yani 120 dönüşü uygun yoldur. Bunu kendim yapmakta zorlanıyorum ve ilerlemem ve faktoring hesaplamasını yazmaya başladım.
Paul Butcher

2
Bunu aldatmayı düşünürdüm, çünkü testi geçebiliyor, ancak gerçek bir işlevsellik katmıyor veya eldeki soruna son bir çözüme yaklaşmanızı sağlıyor.
GrumpyMonkey

3
Müşteri kodu kodunun yalnızca 5'ten geçtiği ortaya çıkarsa, 120'yi döndürmek yalnızca aldatma değil, aynı zamanda meşru bir çözümdür.
Kramii Monica

@PaulButcher ile aynı fikirdeyim - aslında, metinlerde ve makalelerde birçok birim test örneği bu yaklaşımı benimsemiştir.
HorusKol

Yanıtlar:


45

Tamamen yasal. Kırmızı, Yeşil, Refactor.

İlk test başarılı.

Yeni bir giriş ile ikinci testi ekleyin.

Şimdi hızlıca yeşile dönün, iyi çalışan bir if-else ekleyebilirsiniz. Geçer, ama henüz bitmedi.

Red, Green, Refactor ün üçüncü kısmı en önemlisidir. Çoğaltmayı kaldırmak için refactor . Artık kodunuzda çoğaltmaya sahip olacaksınız. Tamsayı döndüren iki ifade. Bu kopyalamayı kaldırmanın tek yolu, işlevi doğru şekilde kodlamak.

İlk seferinde doğru yazma demiyorum. Sadece yapmazsan aldatma olmadığını söylüyorum.


12
Bu sadece soruyu gündeme getirir, neden sadece işlevi doğru bir şekilde yazmıyorsunuz?
Robert Harvey,

8
@Robert, faktöriyel numaralar önemsiz basittir. TDD'nin asıl avantajı, önemsiz olmayan kütüphaneler yazdığınızda ve testi ilk önce yazdığınızda, uygulamadan önce API'yi tasarlamaya zorlarsınız;

1
@Robert, testi geçmek yerine problemi çözmekle ilgilenen sizsiniz. Size önemsiz olmayan problemler için zor tasarımları ertelemenin ve testler yapmanıza kadar daha iyi sonuç verdiğini söylüyorum.

1
@ Thorbjørn Ravn Andersen, hayır, sadece bir dönüşünüz olabileceğini söylemiyorum. Çoklu için geçerli sebepler var (yani, güvenlik ifadeleri). Mesele şu ki, her iki iade ifadesi de "eşit" idi. Onlar da aynı şeyi yaptılar. Sadece farklı değerlere sahiplerdi. TDD sertlikle ilgili değildir ve belirli bir test / kod oranına bağlı kalmaktadır. Bu, kod tabanınızda bir konfor seviyesi oluşturmakla ilgilidir. Başarısız bir test yazabilirseniz, o zaman bu fonksiyonun gelecekteki testleri için çalışacak bir fonksiyon, harika. Yapın, sonra fonksiyonunuzun hala çalıştığından emin olmak için son durum testlerinizi yazın.
CaffGeek

3
Tam (basit de olsa) uygulamanın bir kerede yazılmamasının amacı, testlerinizin bile başarısız olacağı konusunda hiçbir garantinizin olmamasıdır. bir testi geçmeden önce başarısız olduğunu görmek, daha sonra, kodda yaptığınız değişikliğin, üzerinde yaptığınız iddiayı tatmin eden kanıt olduğunu kanıtlamanızdır. TDD'nin bir regresyon test paketi oluşturmak için bu kadar harika olmasının ve zemini "bu anlamda bir testten sonra" testiyle tamamen silmesinin tek nedeni budur.
sara

25

Açıkça, nihai amacın anlaşılması ve bu hedefe uyan bir algoritmanın başarılması gerekir.

TDD, tasarım için sihirli bir madde değildir; kod kullanarak problemleri nasıl çözeceğinizi bilmeniz gerekir ve yine de bir test geçişi yapmak için bunu birkaç satırdan daha yüksek bir seviyede nasıl yapacağınızı bilmek zorundasınız.

TDD fikrini seviyorum çünkü iyi tasarımı teşvik ediyor; kodunuzu test edilebilir olması için nasıl yazabileceğiniz hakkında düşünmenizi sağlar ve genel olarak felsefe kodu genel olarak daha iyi bir tasarıma doğru iter. Fakat yine de bir çözümün nasıl oluşturulacağını bilmek zorundasınız.

Bir testi geçmek için en küçük kod miktarını yazarak bir uygulamayı büyütebileceğinizi iddia eden indirgemeci TDD felsefelerini tercih etmiyorum. Mimari hakkında düşünmeden, bu işe yaramaz ve örneğiniz bunu kanıtlar.

Bob Martin Amca diyor ki:

Teste Dayalı Geliştirme yapmıyorsanız, kendinize bir profesyonel denemek çok zordur. Jim Coplin bunun için beni halıda aradı. Bunu söylemekten hoşlanmadı. Aslında şu anki pozisyonu, Test Odaklı Gelişme'nin mimarileri yok etmektir, çünkü insanlar başka türlü düşünceleri terk etmek için testler yazıyor ve çılgınca koşuşturma testlerini geçmek için mimarlıklarını parçalara ayırıyor ve ilginç bir noktaya değindi. Bu, ayini kötüye kullanmanın ve disiplinin ardındaki amacı kaybetmenin ilginç bir yolu.

eğer mimarlığı düşünmüyorsanız, bunun yerine mimarlığı görmezden gelmek ve birlikte testler atmak ve geçmelerini sağlamak ise, binanın ayakta kalmasına izin verecek olan şeyi yok ediyorsunuzdur çünkü sistemin yapısı ve sistemin yapısal bütünlüğünü korumasına yardımcı olan katı tasarım kararları.

Sadece bir sürü testi bir araya getiremez ve on yıldan on yıl sonra on yıl boyunca geçmelerini sağlayamaz ve sisteminizin hayatta kalacağını varsayarsınız. Kendimizi cehenneme çevirmek istemiyoruz. Bu nedenle, iyi bir test odaklı geliştirici, her zaman büyük resmi düşünerek her zaman mimari kararlar alma bilincindedir.


Gerçekten bir sorunun cevabı, ancak 1+
Kimse

2
@ rmx: Hım, soru şudur: “testi geçmek için minimum kodu yazmak” ile hala işlevselliğini sürdürürken ve gerçekte ne elde etmeye çalıştığınızın ruhuna göre bu dengeyi nasıl elde ediyorsunuz? Aynı soruyu mu okuyoruz?
Robert Harvey,

İdeal çözüm bir algoritmadır ve mimarlıkla ilgisi yoktur. TDD yapmak size algoritmaları icat etmeyecektir. Bir noktada bir algoritma / çözüm olarak adımlar atmanız gerekir.
Joppe

@Rmx ile aynı fikirdeyim. Bu aslında benim kendi soruma cevap vermiyor, ancak TDD'nin genel olarak genel yazılım geliştirme sürecinin büyük resmine nasıl uyduğuna dair düşünceler için gıdaya yol açıyor. Yani, bu nedenle, +1.
CraigTP

Sanırım "mimarlık" yerine "algoritmalar" - ve diğer terimleri - ikame edebileceğinizi ve argüman hala geçerliyse; hepsi ağaçlar için ahşabı görememekle ilgili. Her bir tamsayı girişi için ayrı bir test yazmazsanız, TDD uygun bir faktoring uygulaması ile test edilen tüm durumlar için çalışan bazı sapık sabit kodlamalar arasında ayrım yapamaz. TDD ile ilgili sorun, "tüm testlerin geçtiği" ve "kodun iyi" olduğu bir kolaylıktır. Bir noktada ağır bir sağduyu ölçüsü uygulanmalıdır.
Julia Hayward

16

Çok güzel bir soru ... ve @Robert hariç neredeyse herkesle aynı fikirde olmam gerekiyor.

yazı

return 120;

Bir faktoring fonksiyonunun bir test geçişi yapması zaman kaybıdır . Bu "aldatma" değil, ne de tam anlamıyla kırmızı-yeşil-refactor takip ediyor. Bu yanlış .

İşte nedeni:

  • Hesaplama Faktörü , "sabit döndür" değil özelliktir. "return 120" bir hesaplama değildir .
  • 'refactor' argümanları yanlış yönlendirilmiş; Eğer 5 ve 6 için iki test durumları varsa bir faktöriyel hesaplama olmadığı için, bu kod, yanlış hala hiç :

    if (input == 5) { return 120; } //input=5 case
    else { return 720; }   //input=6 case
    
  • Eğer 'refactor' argümanını tam anlamıyla takip edersek, 5 test vakamız olduğunda YAGNI'yi çağırır ve fonksiyonu bir arama tablosu kullanarak uygulardık:

    if (factorialDictionary.Contains(input)) {
        return factorialDictionary[input]; 
    }
    throw new Exception("Input failure");
    

Bunların hiçbiri aslında bir şey hesaplamıyor, sizsiniz . Ve bu görev değil!


1
@ rmx: hayır, kaçırmadı; "çoğaltmayı kaldırmak için refactor" arama tablosundan memnun olabilir. BTW, ünite testlerinin gereksinimleri kodlama prensibini BDD'ye özgü değildir, genel Agile / XP prensibidir. Eğer gereksinim "Soruyu cevaplayın" 5'in faktörü nedir? "İse, o zaman '120'ye dönün;' okunaklı olurdu ;-)
Steven A. Lowe

2
@Chad hepsi gereksiz bir iştir - ilk defa sadece fonksiyonunu yazınız ;-)
Steven A. Lowe

2
@Steven A.Lowe, bu mantığa göre, neden herhangi bir test yazalım ?! İnternethaber.com "Sadece ilk defa uygulamayı yazın!" TDD'nin noktası, küçük, güvenli, artımlı değişikliklerdir.
CaffGeek

1
@Chad: strawman.
Steven A. Lowe

2
Tam (basit de olsa) uygulamanın bir kerede yazılmamasının amacı, testlerinizin bile başarısız olacağı konusunda hiçbir garantinizin olmamasıdır. bir testi geçmeden önce başarısız olduğunu görmek, daha sonra, kodda yaptığınız değişikliğin, üzerinde yaptığınız iddiayı tatmin eden kanıt olduğunu kanıtlamanızdır. TDD'nin bir regresyon test paketi oluşturmak için bu kadar harika olmasının ve zemini bu anlamda "yaklaşma testi" ile tamamen silmesinin tek nedeni budur. asla yanlışlıkla başarısız olamayacak bir test yazmazsınız. Ayrıca, bobs amcaya ana faktör kata'yı da inceleyin.
sara

10

Yalnızca bir birim testi yazdığınızda, tek satırlı uygulama ( return 120;) yasaldır. 120 değerini hesaplayan bir döngü yazma - bu hile olurdu!

Bu kadar basit ilk testler son durumları yakalamanın ve bir defalık hataları önlemenin iyi bir yoludur. Beş aslında, başladığım giriş değeri değil.

Burada yararlı olabilecek bir kural: sıfır, bir, çok, çok . Sıfır ve bir faktörlü için önemli kenar durumlardır. Tek gömleklerle uygulanabilirler. "Çok" test durumu (örneğin 5!) Daha sonra sizi bir döngü yazmaya zorlar. "Çok" (1000 !?) test durumu, sizi çok büyük sayıları işlemek için alternatif bir algoritma uygulamaya zorlayabilir.


2
"-1" davası ilginç olurdu. İyi tanımlanmadığından, hem testi yazan hem de kodu yazan adamın ilk önce ne olması gerektiği konusunda hemfikir olması gerekir .
gnasher729

2
Aslında factorial(5)kötü bir ilk test olduğunu işaret etmek için +1 . mümkün olan en basit durumlardan başlıyoruz ve her yinelemede, testleri biraz daha spesifik hale getirerek, kodu biraz daha genel hale getirmeye çağırıyoruz. Bob Amca’nın dönüşüm önceliği önceliği dediği şey budur ( blog.8thlight.com/uncle-bob/2013/05/27/… )
sara

5

Sadece tek bir test yaptırdığınız sürece, testi geçmek için gereken minimum kod gerçektendir return 120;ve başka testlere sahip olmadığınız sürece kolayca saklayabilirsiniz.

Bu, aslında bu yöntemin DİĞER değerlerini kullanan testleri yazana kadar daha fazla tasarım ertelemenizi sağlar.

Test, şartname katedilebilen sürümü ve tüm eğer unutmayın o şartname diyor mükemmel o uyan faturası o f (6) = 120 olduğunu.


Ciddi anlamda? Bu mantıkla, her biri yeni bir girdiyle geldiğinde kodu tekrar yazmak zorunda kalacaksınız.
Robert Harvey,

6
@Robert, SOME noktasında yeni bir vaka eklemek, mümkün olan en basit kodla sonuçlanmayacak , hangi noktada yeni bir uygulama yazacaksınız. Testleri zaten yaptırdığınız için, yeni uygulamanızın eskisi ile aynı işlemi yaptığını tam olarak bilirsiniz.

1
@ Thorbjørn Ravn Andersen, tam olarak, Red-Green-Refactor'un en önemli parçası, yeniden yapılanmadır.
CaffGeek

+1: Bu benim bilgimden de genel bir fikir, ancak zımni sözleşmeyi yerine getirme konusunda bir şeyler söylenmesi gerekiyor (ör. Yöntem adı faktörü ). F (6) = 120 'yi sadece spec (örneğin test) yaparsanız, sadece' 120'ye geri dönmeniz gerekir. F (x) == x * x-1 ... * xx-1: upperBound> = x> = 0 olduğundan emin olmak için testler eklemeye başladığınızda, o zaman faktoring denklemini karşılayan bir fonksiyona varacaksınız.
Steven Evers

1
@SnOrfus, "zımni sözleşmeler" in yapılacağı yer, test durumlarındadır. Eğer sözleşmeler yüzdelikçiler içinse, bilinen yüzyüzlüler olup olmadığını ve eğer yüz yüzlü olmayanlar biliniyorsa , TEST yaparsınız . Onlardan bir çoğu. Her onuncu faktöre kadar her on ilk faktörün listesini for-loop testine dönüştürmek çok uzun sürmez.

4

Bu şekilde "hile yapabiliyorsanız", birim testlerinizin hatalı olduğunu gösterir.

Faktoring yöntemini tek bir değerle test etmek yerine, bir değer aralığı olduğunu test edin. Veriye dayalı testler burada yardımcı olabilir.

Birim testlerinizi gereksinimlerin bir belirtisi olarak görün - test ettikleri yöntemin davranışını toplu olarak tanımlamaları gerekir. (Bu davranış odaklı gelişme olarak bilinir - geleceği ;-))

Öyleyse kendinize sorun - eğer birisi uygulamayı yanlış bir şeyle değiştirseydi, testleriniz yine de geçer mi yoksa “bir dakika bekle!

Bunu aklınızda bulundurarak, eğer tek testiniz sorunuzdaki ise, teknik olarak ilgili uygulama doğrudur. Sorun daha sonra zayıf tanımlanmış gereksinimler olarak görülür.


Nanda belirttiği gibi, her zaman sonsuz bir dizi ekleyebilir casea ifadeleri switchve OP'ın örneğin mümkün olan her giriş ve çıkış için bir test yazamam.
Robert Harvey,

Teknik olarak ile arasındaki değerleri test Int64.MinValueedebilirsiniz Int64.MaxValue. Çalıştırması uzun zaman alacaktı ancak açık bir şekilde hataya gerek kalmadan gereksinimi tanımlayabilecekti. Mevcut teknolojiyle, bu mümkün değil (gelecekte daha yaygın olacağından şüpheleniyorum) ve katılıyorum, hile yapabilirsin ama OP'lerin sorusunun pratik bir soru olmadığını düşünüyorum (hiç kimse bu şekilde hile yapmaz) pratikte), fakat teorik olanı.
Hiç kimse

@ rmx: Bunu yapabilseydiniz, testler algoritma olurdu ve artık algoritmayı yazmanıza gerek kalmayacaktı.
Robert Harvey,

Bu doğru. Üniversite tezim aslında, TDD'ye yardımcı olarak genetik algoritmalı bir kılavuz olarak birim testleri kullanarak uygulamanın otomatik olarak oluşturulmasını içerir - ve sadece katı sınavlarla mümkündür. Aradaki fark, gereksinimlerinizi kodunuza bağlamak, ünite testlerini içeren tek bir yöntemden okumak ve kavramaktan çok daha zor. Öyleyse, soru şu: Uygulamanız, birim testlerinizin bir tezahürü ise ve birim testleriniz, gereksinimlerinizin bir tezahürüyse, neden sadece testi tamamen atlamıyorsunuz? Bir cevabım yok.
Hiç kimse

Ayrıca, bizler gibi, uygulama kodunda olduğumuz gibi birim testlerinde hata yapma ihtimalimiz yok mu? Peki neden birim testi?
Hiç kimse

3

Sadece daha fazla test yaz. Sonunda, yazmak için daha kısa olurdu

public long CalculateFactorial(long input)
{
    return input <= 1 ? 1 : CalculateFactorial(input-1)*input;
}

göre

public long CalculateFactorial(long input)
{
    switch (input) {
       case 0: return 1;
       case 1: return 1;
       case 2: return 2;
       case 3: return 6;
       case 4: return 24;
       case 5: return 120;
    }
}

:-)


3
Neden sadece algoritmayı ilk önce doğru yazmıyorsunuz?
Robert Harvey,

3
@Robert, 0'dan 5'e kadar olan bir sayıya ait faktörlerin hesaplanması için doğru bir algoritmadır. Bu çok basit bir örnek, ancak daha karmaşık hale geldiğinde, "doğru" ne anlama geldiğiyle ilgili birçok derecelendirme olur. Root erişimi gerektiren bir program "doğru" mu? XML kullanmak, CSV kullanmak yerine "doğru" mu? Buna cevap veremezsin. TDD'de testler olarak formüle edilen bazı işletme gereksinimlerini karşıladığı sürece herhangi bir algoritma doğrudur.
P

3
Çıkış tipi uzun olduğu için, fonksiyonun doğru şekilde işleyebildiği çok az sayıda giriş değeri vardır (20 ya da öylesine), bu nedenle büyük bir anahtar ifadesi mutlaka en kötü uygulama değildir - eğer hız daha fazlaysa Kod boyutundan önemli olarak, switch ifadesi önceliklerinize bağlı olarak gitmenin yolu olabilir.
user281377

3

"Hile" testleri yazmak "Tamam" için yeterince küçük değerler için tamamdır. Ancak geri çağırma - ünite testi ancak tüm testler geçtiğinde tamamlanır ve başarısız olacak hiçbir yeni test yazılamaz . Eğer gerçekten bir sürü if ifadesi içeren bir CalculateFactorial metoduna sahip olmak istiyorsanız (ya da daha iyisi, büyük bir switch / case ifadesi :-) bunu yapabilirsiniz ve gerekli olan sabit bir numara ile uğraşıyorsanız) Bunu uygulamak sonludur (muhtemelen oldukça büyük ve çirkin olsa da ve belki de bir prosedür kodunun maksimum boyutunda derleyici veya sistem sınırlamaları ile sınırlıdır). Bu noktada eğer gerçektenTüm gelişimin bir birim testiyle yürütülmesi gerektiğinde ısrar edersiniz, sonucu if için tüm ifadeleri takip ederek gerçekleştirilebilecek süreden daha kısa bir sürede hesaplamak için kod gerektiren bir test yazabilirsiniz .

Temel olarak TDD, gereksinimleri doğru şekilde uygulayan bir kod yazmanıza yardımcı olabilir , ancak sizi iyi bir kod yazmaya zorlayamaz . Sana bağlı.

Paylaş ve Keyfini çıkar.


"Birim sınaması yalnızca tüm sınamalar tamamlandığında tamamlanır ve başarısız olacak hiçbir sınama yapılmazsa yazılır" +1, birçok kişi sabitini döndürmek için yasal olduğunu söylüyor, ancak "kısa vadede" ile devam etmiyor. genel şartlar sadece bu özel durumlara ihtiyaç
duyarsa

1

Robert Harvey’in önerisine% 100 katılıyorum, bu sadece testleri geçmekle ilgili değil, aynı zamanda genel hedefi aklınızda tutmanız gerekiyor.

"Sadece belirli bir girdi grubuyla çalıştığı doğrulandı" fikrinize bir çözüm olarak, xunit teorisi gibi veriye dayalı testleri kullanmayı öneriyorum. Bu kavramın ardındaki güç, kolayca girdilerin çıktılara spesifikasyonlarını oluşturmanıza izin vermesidir.

Factorials için bir test şöyle görünür:

    [Theory]
    [InlineData(0, 1)]
    [InlineData( 1, 1 )]
    [InlineData( 2, 2 )]
    [InlineData( 3, 6 )]
    [InlineData( 4, 24 )]
    public void Test_Factorial(int input, int expected)
    {
        int result = Factorial( input );
        Assert.Equal( result, expected);
    }

Hatta bir test verisi sağlayıcısı (geri döndüren IEnumerable<Tuple<xxx>>) uygulayabilir ve tekrar tekrar n ile bölen n-1 gibi bir matematiksel değişmezi kodlayabilirsiniz.

Bu testin çok güçlü bir yolu olduğunu düşünüyorum.


1

Hala hile yapabiliyorsanız, testler yeterli değildir. Daha fazla test yaz! Örneğin, giriş 1, -1, -1000, 0, 10, 200 ile testler eklemeye çalışacağım.

Yine de, gerçekten hile yapmaya karar verirseniz, o zaman sonsuz bir yazabilirsiniz. Bu durumda, kod incelemesi dışında hiçbir şey yardımcı olamaz. Yakında kabul testine yakalanırdın ( başka bir kişi tarafından yazılmış! )

Ünite testlerinde problem bazen programcıların gereksiz iş olarak görmeleridir. Onları görmenin doğru yolu, çalışmanızın sonucunu doğru yapmanız için bir araçtır. Öyleyse eğer if-o zaman yaratırsan, bilinçsizce göz önünde bulundurulması gereken başka durumlar olduğunu biliyorsun. Bu, başka testler yazmanız gerektiği anlamına gelir. Ve böyle devam ederek hile yapmanın işe yaramadığını anlayana kadar ve sadece doğru şekilde kodlamak daha iyidir. Hala bitmediğini hissediyorsan, bitmezsin.


1
Bu nedenle, yalnızca sınavın geçmesi için yeterli miktarda kod yazmanın (TDD'nin savunucuları olarak) yeterli olmadığını söylüyorsunuz. Ayrıca, sağlam yazılım tasarımı ilkelerini akılda tutmanız gerekir. BTW ile aynı fikirdeyim.
Robert Harvey,

0

Test seçiminin en iyi test olmadığını söyleyebilirim.

Şununla başlardım:

Faktoring (1) ilk test olarak

ikinci olarak faktörlü (0)

üçüncü olarak faktörlü (-ve)

ve önemsiz olmayan davalara devam

ve bir taşma dava ile bitirin.


Nedir -ve??
Robert Harvey

negatif bir değer.
Chris Cudmore
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.