Festlegen von Grenzen zwischen rspec und gurk in Rails

8

Ich mag die Art, wie Cucumber Benutzerspezifikationen mit Integrationstests verbindet. Der Cucumber -Teil ist mir mehr oder weniger klar.
Ich kämpfe, wenn es darum geht, was mit rspec (Nicht-Integrationstests) getestet werden soll und was nicht.
Ist es richtig, einen Unit-Test mit rspec etwas zu testen, das bereits mit Cucumber getestet wurde (zB Unit-Test scheitert 100%, wenn der Cucumber-Test fehlschlägt, und Unit-Test wird 100% erfolgreich sein, wenn der Cucumber-Test erfolgreich ist)? / p>

Um genau zu sein, habe ich drei Beispiele, die ich gerne lösen würde.

  1. Hier ist ein Fall aus dem RSpec-Buch. Sie haben folgende Cucumber scenario :

    %Vor%

    Sie erstellen zwei rspec-tests direkt nach:

    %Vor%
  2. Ein weiteres Beispiel ist das Testen von Routing oder Aktionsumleitung, während das folgende Szenario gilt:

    %Vor%
  3. Manchmal testen wir Helfer, die bereits mit Cucumber getestet wurden:

    %Vor%

    Ich sollte wahrscheinlich Helfer testen, der 283 Minuten in "4:43" bricht, aber es stellt sich heraus, dass es bereits mit Cucumber getestet wurde.

Es sind vielleicht nicht die besten Beispiele, aber es illustriert, wovon ich spreche.
Für mich sind diese Tests Duplikate.

Könnten Sie bitte die obigen Beispiele kommentieren?

Gibt es irgendwelche Prinzipien oder Richtlinien dazu, was mit rspec getestet werden soll, wenn Cucumber tests bereits vorhanden sind?

    
Alex Smolov 30.03.2013, 23:33
quelle

1 Antwort

10

All dies ist nur meine persönliche Meinung zu diesem breiten und offenen Thema. Manche Leute können nicht zustimmen und lustig genug können sie.

Als allgemeine Richtlinien sollten Sie Gurke verwenden, um den gesamten Anwendungsstapel zu testen, was als user experience bezeichnet wird. Dieser Anwendungsstapel könnte aus vielen kleineren unabhängigen Objekten bestehen, aber genauso wie Benutzer mit Ihrer Anwendung nicht an diesen Details interessiert wäre, sollte sich Ihr Gurken Test nicht interessieren sie und konzentrieren sich stattdessen auf äußere Schicht Ihrer Anwendung.

RSpec ( in Ihrem Setup! ) sollte sich andererseits auf diese kleinen Objekte konzentrieren, Bausteine ​​Ihrer Anwendung.

Es gibt ein großes Problem mit kleinen Anwendungsbeispielen aus den Büchern: Sie sind zu klein!

Der Übergang zwischen der äußeren Schicht Ihrer Anwendung und ihren Innenräumen ist verschwommen. Ganze Anwendung wird mit zwei Objekten erstellt! Es ist schwer zu unterscheiden, was was testen soll. Wenn Ihre Anwendung an Größe zunimmt, wird es immer offensichtlicher, was ein Benutzererfahrungstest (Gurke) ist und was Objekt - Status Test / Nachrichtenerwartungstest (RSpec) ist.

Verwenden Sie Ihr zweites Beispiel:

Mit dieser Gurkengeschichte:

%Vor%

Rspec:

Sie werden wahrscheinlich ein Benutzermodell haben:

  • Test Benutzername Syntax (muss zum Beispiel mit Großbuchstaben beginnen)
  • Test Passwort muss 7 Zeichen haben Zahlen usw. ...

Sie können eine Art Authentifizierungsobjekt haben:

  • Test auf gültige und ungültige Logins usw.
  • Test für Ausnahmen geworfen werden ....

Was ist, wenn sich Ihre Authentifizierungsdatenbank auf einem anderen Server befindet?

  • Mache Verbindungs- und Authentifizierungsdatenbank und prüfe, ob die Datenbank eine Anfrage vom Authentifizierungsobjekt erhält.

Und yada yada yada ... Für immer schützt Ihr Gurken-Test den allgemeinen Zweck Ihrer Anwendung Benutzer-Login . Auch wenn Sie unter dieser Haube Verhalten hinzufügen oder ändern, können Sie sicher sein, dass sich der Benutzer anmelden kann.

  • Sie sollten die Dinge einmal (an einem Ort) testen
  • Objekt ist verantwortlich für das Testen seiner eingehenden Massage (Objekt öffentliche Schnittstelle) für den Status (Rückgabewert)
  • Wenn Ihr Objekt von einem anderen Objekt abhängt (es sendet eine Nachricht), testen Sie es nicht auf den Status (Rückgabewert), dass das Objekt dafür verantwortlich ist.
  • Wenn Ihr Objekt von einem anderen Objekt abhängt (sendet eine Nachricht), spotten Sie über das zweite Objekt und testen Sie, ob es Ihre Nachricht empfängt.

Im Allgemeinen ist Ihre Frage zu breit und Sie werden nicht eine einzige Antwort finden, unterschiedliche Leute werden unterschiedliche Ideen haben. Worauf du dich konzentrieren solltest, ist, so gut du kannst zu testen und mit der Zeit wirst du definitiv richtigen Weg für dich finden. Kein großer Testanzug ist viel besser als keiner.

Weil gutes Design hilft, einen guten Test zu schreiben, würde ich Praktisches objektorientiertes Design in Ruby: Agile Primer empfehlen > von Sandi Metz (das ist eines der besten Bücher, die ich gelesen habe)

    
Kocur4d 31.03.2013, 01:52
quelle