Wie fange ich mit Ruby on Rails mit TDD an? [geschlossen]


167

Ich bin mit den Konzepten vertraut (habe Testkurse am College besucht), bin mir aber noch nicht sicher, wie ich sie wirklich anwenden soll, da ich nie an einem "echten" TDD-Projekt gearbeitet habe.

Ich bin im Begriff, mit der Entwicklung eines Projekts mit Ruby on Rails zu beginnen (höchstwahrscheinlich mit 2.3). Diese Anwendung wird zum Verwalten von Daten, Benutzern und einigen Dateien verwendet. Es wird zunächst nicht zu kompliziert sein, könnte aber in den nächsten 6 Monaten stark skalieren, sodass ich der Meinung bin, dass dies der richtige Zeitpunkt ist, um mehr über TDD zu erfahren.

Ich habe eine grundlegende Idee, wie es geht, aber ich brauche noch einige Hinweise und Ratschläge:

  • Welchen Artikel zu Ruby on Rails TDD 101 soll ich lesen?

  • Was muss ich testen?

  • Welches Juwel / Plugin soll ich verwenden?

  • Soll ich rspec verwenden ? Etwas anderes?

  • Wie kann ich sie bereitstellen, nachdem ich alle meine Testklassen erhalten habe? (zB: Kontinuierliche Integration)

  • Wie zeitaufwändig ist TDD wirklich?

  • Muss ich ein Buch darüber lesen oder kann ich alles bekommen, indem ich einfach damit herumspiele und Online-Tutorials lese? Wenn ich ein Buch lesen muss, welches Buch?


Ich lerne gerne mit Beispielen, also könnte mir jemand sagen, wie ich einen TDD-Ansatz wählen würde, um dieses Problem zu lösen:

Ich habe Firmen. Ich habe Kontakte. Ein Kontakt kann mit 1 Unternehmen verknüpft werden. Ein Unternehmen kann mehrere Kontakte haben. Ich möchte Möglichkeiten schaffen, um Kontakte und Unternehmen zu erstellen und Kontakte mit Unternehmen zu verknüpfen.

Sie müssen dieses Beispiel nicht in Ihrer Antwort verwenden, aber es würde helfen :)

Antworten:


202

Welchen Artikel zu Ruby on Rails TDD 101 soll ich lesen?

Ich werde mit einer Anleitung zum Testen von Schienenanwendungen beginnen .

Außerdem bietet Railscast einige hervorragende Screencasts zur Verwendung verschiedener Testwerkzeuge.

Was muss ich testen?

Ich werde mit Modellen beginnen, da sie leicht zu testen sind. Die einfache Regel lautet, dass Sie jede if-Anweisung in Ihrem Test abdecken müssen.

Sie sollten den Zweck der Methode (um sicherzustellen, dass sie wie erwartet funktioniert) sowie alle Randfälle testen.

Stellen Sie außerdem sicher, dass Sie nicht zu viel testen.

Welches Juwel / Plugin soll ich verwenden? Soll ich rspec verwenden? Etwas anderes?

Wenn Sie anfangen, verwenden Sie einfach Test Unit. Sie können verwenden rspecoder cucumbernachdem Sie sich mit den Grundlagen vertraut gemacht haben.

Autotestist ein gutes Werkzeug, wenn Sie wirklich testgetrieben sein möchten. Aber es ist ein "nice have" nicht erforderlich.

Wenn ich alle meine Testklassen habe, wie kann ich sie bereitstellen?

Ich bin mir nicht sicher über die Frage. Normalerweise stellen Sie die Tests nicht bereit. Sobald Sie alle Ihre Testklassen haben, geben Sie einfach 'Rake Test' ein, um alle Ihre Tests auszuführen.

Wie zeitaufwändig ist TDD wirklich?

Das spart wirklich Zeit. Wenn Sie ein Labyrinth-Puzzle mögen, wissen Sie, dass es fast immer einfacher ist, es zu lösen, wenn Sie vom Ende zum Anfang gehen. Gleiches gilt für TDD. Ohne Test Driven denken Sie konsequent darüber nach, was ich als nächstes tun soll. Bei Test Driven sagt Ihnen der Test, was als nächstes zu tun ist (er bricht ab, wenn die Logik nicht vorhanden ist, sodass Sie nur den defekten Teil reparieren müssen). Außerdem haben Sie weniger Fehler, wodurch Sie auf lange Sicht viel Zeit sparen.

Muss ich ein Buch darüber lesen oder kann ich alles bekommen, indem ich einfach damit herumspiele und Online-Tutorials lese? Wenn ich ein Buch lesen muss, welches Buch?

Du brauchst kein Buch. Die effizienteste Art, etwas zu lernen, ist: Mach es einfach. Kehren Sie zum Buch oder zu den Online-Ressourcen zurück, sobald Sie auf eine Frage oder ein Problem stoßen. Das ist auch agil.

In Ihrem Beispiel müssen folgende Tests durchgeführt werden: Ein Kontakt kann mit einem Unternehmen verknüpft werden. Ein Unternehmen kann mehrere Kontakte haben, Möglichkeiten zum Erstellen von Kontakten erstellen und Kontakte mit Unternehmen verknüpfen.

class CompanyTest <Test::Unit
    def test_relationship # test associations/relationships
        c = companies(:some_company)
        assert_equal [a list of contacts], c.contacts # make sure a company can have multiple contacts
    end
end

class ContactTest<Test::Unit
   def  test_relationships
        c = contact(:some_contact)
        assert_equal some_company, c.company # make sure the contact link to 1 company
   end

   def  test_create/add
        # test create contacts, here you need to make sure the contact is created correctly, and linked to company correctly
   end
end

3
Der Link zum Artikel ist defekt, wurde aber hier gefunden: web.archive.org/web/20100325215651/http://bloritsch.d-haven.net/…
fivetwentysix




5

Bei TDD geht es darum, zuerst Tests zu schreiben. Dies zwingt Sie grundsätzlich dazu, Ihren eigenen Client zu schreiben, bevor Sie Ihren Anwendungscode schreiben. Der Zyklus besteht im Allgemeinen darin, einen Test für eine nicht vorhandene API zu schreiben, den Test mit der Erwartung eines Fehlschlags auszuführen, den API-Code zu schreiben, den Test erneut auszuführen und sicherzustellen, dass er erfolgreich ist. Dann schreibe deinen nächsten Test ... und so weiter.

Dieser Rails-Leitfaden könnte Sie auch interessieren .



3

Welches Juwel / Plugin soll ich verwenden?

Ich habe es immer genossen shoulda .

Wie zeitaufwändig ist TDD wirklich?

Der Grund, warum ich die TDD-Entwicklung immer bevorzugt habe, ist, dass sie sich darauf konzentriert, wie ich einen bestimmten Code implementieren werde. Ich habe das anekdotische Gefühl, dass ich weniger Zeit damit verbringe, später zu überarbeiten, wenn ich mich stärker an TDD-Prinzipien halte. Die aufgewendete Zeit hängt jedoch davon ab, wie gut Sie Unit-Tests schreiben. Wenn die Komponententests nicht das erwartete Verhalten erfassen, wird die gesamte dafür aufgewendete Zeit verschwendet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.