2009-09-19 5 views
21

Ich bin ein wenig verwirrt durch die schiere Anzahl der Test-Frameworks für Ruby/ROR.Schafft Gurke die Notwendigkeit, Unit-Tests zu schreiben?

Ich habe kürzlich die Cucumber Railscasts beobachtet und fand sie sehr interessant. Also fing ich an, ein Theaterstück zu spielen und kämpfte dann um konzeptionell zu sehen, wo ich verschiedene Tests machen würde.

Es scheint durchaus möglich zu sein, alles zu tun, was in Komponententests in Cucumber gemacht werden kann, also muss ich Komponententests schreiben oder einfach nur meine Featuredefinitionen schreiben und mich auf eine so gute Abdeckung wie ich konzentrieren kann das nutzen.

Sollte ich meine Unit-Tests mit Rspec oder Test: Unit erstellen? Wenn ich Ajax-Funktionalität testen möchte, sollte ich Selenium oder Watir verwenden?

Es scheint so viele Optionen hier zu geben Ich kämpfe um zu sehen, welche Werkzeuge zu verwenden und wo die Grenzen sind.

Was sind die Erfahrungen anderer Menschen von Gurke und wo die Grenze zwischen Schreiben Gurkenintegration Tests und Test: Einheit und/oder Rspec basierte Einheit und Funktionstests zu ziehen. Kennt jemand eine gute Beschreibung zu diesem Thema, die vorschlägt, wo man die Grenzen zwischen den Testmethoden und den Stärken und Schwächen der verschiedenen Tools ziehen soll?

Ich weiß, dass einige davon subjektiv sind, aber gemeinsame Ansätze, wie man dieses Problem angehen würde, wären willkommen.

Antwort

20

Verwenden Sie Gurke auf einer hohen Ebene, um zu beschreiben, was ein Benutzer sehen und tun sollte. Verwenden Sie RSpec, Test: Unit, Shoulda usw., um Komponententests zu schreiben. Gerade von the horse's mouth:

Wenn Sie sich entscheiden, ein neues Feature hinzufügen möchten oder einen Fehler zu beheben, starten Sie durch ein neues Feature oder Szenario zu schreiben, die beschreibt, wie die Funktion sollte funktionieren. Schreibe (noch) keinen Code.

...

Dies ist, wenn Sie beginnen, Code zu schreiben. Beginnen Sie damit, ein paar Zeilen Code zu schreiben, um den Fehler zu beheben, den Sie von Cucumber bekommen haben. Gurke wieder laufen lassen. Wiederholen und spülen Sie, bis Sie mit Ihrer Funktion zufrieden sind. Wenn Sie sich mit den wichtigsten Details beschäftigen, sollten Sie eine Abstraktionsebene aufrufen und RSpec oder ein Ruby-Testframework verwenden, um einige Spezifikationen/Tests für Ihre Klassen zu schreiben.

Gurke wird gemacht, um Ihren gesamten Stapel zusammen zu testen, im Gegensatz zu "Einheiten".

Sie müssen entscheiden, wo die Linie zu zeichnen, aber eine Menge unter der Haube Zeug würde wahrscheinlich nicht in einem Gurkentest abgedeckt werden. Sagen Sie bei der Anmeldung, ich fülle ein Formular aus, mit meinem Namen, E-Mail, Telefonnummer, etc. Ein Komponententest überprüft möglicherweise, ob ein neuer User auch einen neuen TelephoneNumber erstellt. Aus der Sicht des Benutzers ist es nicht wirklich wichtig, dass es eine neue TelephoneNumber erstellt, sie kümmern sich, dass sie nach der Anmeldung ein Konto haben und ihre Telefonnummer sehen können.

Ich habe keine zu viel Erfahrung schreiben Gurken Tests (noch nicht), aber ich hoffe, das hilft ein bisschen.

1

Persönlich glaube ich nicht, dass Sie aufhören sollten, Komponententests zu schreiben. Als Akzeptanztest-Tool sollte Cucumber Ihre Funktionstests ersetzen und, wenn Sie schreiben, Tests anzeigen.

Gurken-Funktionen sollen einfach und an den tatsächlichen Wert eines bestimmten Features gekoppelt sein.

6

Wenn ein Komponententest fehlschlägt (ich meine einen echten Komponententest, der eine Methode isoliert mit Mocks testet), sagt er Ihnen, was "Einheit" ein Problem hat. Wenn ein Abnahmetest fehlschlägt, sagt er Ihnen, wo "Feature" ein Problem hat, nicht wo das Problem liegt.

3

Wenn Sie eine Rails-App erstellen, erhalten Sie standardmäßig Funktions-, Interaktions- und Komponententests. Gurke ist ein zusätzlicher Test, es ist eine Möglichkeit, auch die Erfahrung zu testen, die Ihr Benutzer haben wird. Wenn sie auf den Button mit der Aufschrift "go" klicken, sollten sie "success" statt 404 anzeigen. Dadurch wird sichergestellt, dass nichts, was Sie tun, die Benutzererfahrung verfälscht und dass Ihre Anwendung von oben nach unten am häufigsten funktioniert Anwendungsfälle, an die Sie denken können. Die anderen Tests sollen sicherstellen, dass nichts schief geht und dass Sie jedes Modell und jede Methode mit einem Mikroskop untersucht haben. Es kann möglich sein, Einheitentests in ihrer Gesamtheit mit Gurken zu replizieren, aber es wäre schmerzhaft (und verrückt langsam auszuführen, besonders wenn Sie Selen verwenden). Die beste Zeit, um Tests zu schreiben, ist, wenn Sie Code entwickeln, und der schnellste und einfachste Weg, dies zu tun, ist, indem Sie in den integrierten Rails-Tests und vielleicht einige zusätzliche Hilfe wie shopa, rspec, auch ich bin großer Fan von Fabrikmädchen. Wenn Sie es noch nicht überprüft haben, www.railscasts.com hat ein tolles Intro zu Gurken, und Rspec, und Fabrik-Mädchen, ... Ich weiß, dass diese Frage schon beantwortet wurde (es ist nein), aber das ist meine zwei Cent . Viel Glück beim Codieren !!

3

Ich habe viel mit dieser Frage gedacht/gekämpft, und hier bin ich angekommen.

Gurke zuerst und Gurke zuletzt. Gurke bietet die primäre Testabdeckung.

Die Kernmodellmethoden, die die eigentliche Geschäftsarbeit der Anwendung ausführen, sollten ebenfalls mit rspec/unit-Tests entwickelt/abgedeckt werden.

Warum testet das Gerät auch?

1) Die Komponententests werden viel schneller getestet. 2) Diese Kerngeschäftslogik kann (wird wahrscheinlich) auf verschiedene Arten über die aktuellen Ansichten hinaus verwendet werden (was Cucumber testet). Diese Methoden sollten mit allen Arten von möglichen Eingaben und Ausgaben versehen werden, die die Methode im Test direkt aufrufen.

Warum nicht Unit-Test den Rest der Modelle, und die Controller und Ansichten?

1) Gurke hat es schon einmal abgedeckt. 2) Ich finde, dass die Sichten-Controller-einige-Modell-Methoden alle zusammen arbeiten, um Dinge zu erledigen (denken Sie, dass alles ausgeführt wurde, um sich einzuloggen); also teste ich sie gerne zusammen.

+0

"Gurke zuerst und Gurke zuletzt" Schön zitierbar. Ich denke, diese Antwort ist mehr auf der Ebene, die Anfänger wie ich brauchen. – KobeJohn

0

Aus meiner Erfahrung haben Gurke und Rspec unterschiedliche Anziehungskraft. Rspec spricht mich aus einer Entwicklerperspektive an, weil es einfach zu schreiben ist und sehr schnelle Rückmeldung gibt, wenn etwas kaputt geht. Gurke gefällt mir als Entwickler nicht, weil sie nicht so schnell läuft wie Rspec. Allerdings ist Cucumber für mich als Business-Stakeholder attraktiv, da es die vollständige Abdeckung aller Funktionen bietet.

Tun Sie sich selbst einen Gefallen und schreiben Sie weiterhin Komponententests.

2

Ich übe Gurke/RSpec seit dem letzten halben Jahr oder so BDD zu tun.

Zunächst ist BDD nicht leicht zu erreichen, es wird sich am Anfang unnatürlich anfühlen.

Aber sobald Sie sich darauf einlassen, gibt es keinen anderen Weg, um zu programmieren.

Um Ihre Frage zu beantworten. Um Javascript zu testen, benötigen Sie einen JavaScript-Treiber, der von Capybara verwendet werden kann und von Cucumber verwendet wird.

Capybara-Webkit ist, was alle coolen Kinder verwenden jetzt in diesen Tagen

Es gibt eine wichtige Sache zu beachten.

Integrationstests sind langsam.

Und Unit-Tests sind schnell, aber kann langsam sein, so ist es wichtig, dass Sie die richtige Datenbank-Reiniger verwenden und Sie schreiben gute Tests, die gute Isolierung haben.

Mein Test-Setup, die ich mit sehr glücklich bin:

Schutz für das Laden Spork Spork für schnellere Tests Gurke für Integrationstests Capybara-Webkit für Javascript-Test RSpec für Unit-Tests

I Sehen Sie sich keine Tests und Controller-Tests an, da diese meiner Meinung nach überflüssig sind, denn gute Kenntnisse von XPATH werden Sie bemerkenswerte Tests schreiben lassen, die sogar Ihr Seitenlayout und Ihre Struktur abdecken.

Verwandte Themen