2016-04-17 8 views
1

Hallo, ich bin ein Neuling zu TDD-Stil-Programmierung in C# und ich habe viel zu kämpfen, um es richtig zu machen. Könnten Sie mir bitte Bescheid geben, wenn ich das richtig mache? Ich habe viele Tutorials verfolgt, aber es ist nicht gelungen. Ich bekomme den theoretischen Aspekt, aber wenn es darum geht, es praktisch umzusetzen, scheitere ich immer.mein Algorithmus üben mit TDD

Ich habe dieses Repository zum Üben tdd https://github.com/dev-test-tdd/AlgorithmPractice/. Ich habe angefangen, alle Algorithmen von Grund auf neu zu schreiben, um tdd zu verstehen. Zum Beispiel habe ich diese einfache Methode, um zu überprüfen, ob die angegebene Zeichenfolge ein Palindrom ist oder nicht.

Hier ist mein Test

[Test] 
public void IsPalindrome3Test() 
{ 
    var sourceString = "civic"; 
    var result = Program.IsPalindrome3(sourceString); 

    Assert.AreEqual(true, result); 
} 

und die Funktion

public static bool IsPalindrome3(string source) 
{ 
    int min = 0; 
    int max = source.Length - 1; 
    while(true) 
    { 
     if(min > max) 
     { 
      return true; 
     } 
     char a = source[min]; 
     char b = source[max]; 

     if(char.ToLower(a)!= char.ToLower(b)) 
     { 
      return false; 
     } 
     min++; 
     max--; 
    }  

} 

Bin ich hier richtig, wenn Sie den Test zu schreiben? Bitte lassen Sie mich wissen, ob der gewählte Ansatz richtig ist. Irgendwelche Hinweise dafür wären toll !!

+0

Anstelle von 'Assert.AreEqual (true, result);' könnten Sie 'Assert.IsTrue (result);' verwenden. Außerdem scheint Ihre Herangehensweise gut zu sein. Stellen Sie nur sicher, dass Sie einen negativen Komponententest schreiben, um sicherzustellen, dass die zu testende Methode nicht immer "wahr" zurückgibt. –

+0

Warum überprüfen Sie einfach nicht, ob die Zeichenfolge ist die gleiche iterating durch alle Zeichen vorwärts und rückwärts –

+0

Mit Blick auf das Beispiel, das Sie gegeben haben, wenn Sie diesen Test zuerst würden Sie mehr Tests haben, da es viel mehr mögliche Ergebnisse gibt als was du getestet hast. Grundsätzlich könnte ich den Test bestehen, den Sie einfach haben, indem Sie wahr zurückgeben. Denken Sie daran, dass der Schlüssel zu TDD nur darin besteht, zu schreiben, was notwendig ist, damit der Komponententest besteht. Das bringt dich dazu, einen anderen zu schreiben, der dich deinem Endziel näher bringt. @kai hat ein gutes Beispiel dafür. – JCisar

Antwort

5

Das ist nicht wirklich TDD Sie sprechen. Dies ist nur ein Komponententest. TDD bezieht sich speziell auf das Schreiben Ihrer Tests vor Ihrem Code. Sie beginnen mit dem trivialsten Fall, sehen, wie der Test fehlschlägt, lassen ihn auf die einfachste mögliche Weise passieren und erzwingen dann einige neue Annahmen, indem Sie weitere Tests schreiben. Der Punkt ist, dass der Code generischer wird, wenn Ihre Tests spezifischer werden und mehr Randfälle abdecken.

Es gibt viele Möglichkeiten, dies zu tun, und die Leute bevorzugen unterschiedliche Granularität. Eine Version wäre so etwas wie:

// Single character is always a palindrome 
Assert.True(IsPalindrome("a")); 

Was uns veranlassen würde, einen möglichst einfachen Code zu schreiben, diesen Durchgang zu machen

bool IsPalindrome(string input) 
{ 
    return true; 
} 

Dieser Code ist nicht „richtig“, obwohl (obwohl es für alle richtig ist Dinge, für die wir gerade testen. Wir brauchen mehr Tests!

// Two non-equal characters are not a palindrome 
Assert.False(IsPalindrome("ab")); 

führt zu

bool IsPalindrome(string input) 
{ 
    return input.Length == 1; 
} 

Und so weiter. Das Durchlaufen des gesamten Prozesses der Implementierung des vollständigen Algorithmus dauert zu lange für eine SO-Antwort, ich möchte nur zeigen, dass es ein iteriver Prozess mit kurzen Feedback-Schleifen ist, wo Sie ständig stärkere und stärkere Behauptungen darüber aufstellen, wie der Code funktionieren sollte und dann Sie Lass den Algorithmus wachsen. Es gibt viele Videos auf youtube darüber, sowie Bücher und Blogs. Schau sie dir an!

Last but not least ist es auch wichtig, dass wir, wenn unsere Tests vorübergehen, sicherstellen, den Code auch zu "säubern". Den Code so einfach wie möglich passieren zu lassen, führt oft zu hässlichen Wiederholungen und dergleichen. Wenn Tests bestanden werden, können wir dies umgestalten, während wir darauf vertrauen, dass unser Code immer noch den Behauptungen entspricht, die wir gemacht haben. Es ist jedoch wichtig, beim Refactoring nicht mehr Funktionalität hinzuzufügen, da diese Funktionalität dann nicht zuerst als Test geschrieben wird, was der eigentliche Sinn des Vorhabens ist.