Wie können Sie Tests für Selen (oder ähnliches) schreiben, die nicht aufgrund geringfügiger oder kosmetischer Änderungen fehlschlagen?

9

Ich habe die letzte Woche damit verbracht, Selen zu lernen und eine Reihe von Webtests für eine Website zu erstellen, die wir starten werden. Es war großartig zu lernen und ich habe einige Xpath- und CSS-Ortungstechniken gelernt.

Das Problem für mich ist jedoch, dass kleine Änderungen die Tests unterbrechen - jede Änderung an einem Div, einer ID oder einer Autoid-Nummer, mit deren Hilfe Widgets identifiziert werden können, unterbricht eine beliebige Anzahl von Tests - es scheint nur sehr spröde zu sein.

Haben Sie also Selentests (oder ähnliche Tests) geschrieben und wie gehen Sie mit der Sprödigkeit der Tests um (oder wie verhindern Sie, dass sie spröde werden), und für welche Art von Tests verwenden Sie Selen?

Sam J.
quelle
Wenn kleine Änderungen die Tests unterbrechen, werden die Tests nicht ausgeführt, nachdem die Änderungen vorgenommen wurden - das ist der springende Punkt der Tests. Außerdem scheint das Bewusstsein der Entwickler für die (Existenz der) Tests zu fehlen.
Talonx
1
@talonx - es ist nicht genug , nur diese Art von Test auszuführen, wenn eine kleine Änderung einer großen Veränderung in die Suite dann unabhängig davon , als problematisch es geht , ob sie läuft durch den Entwickler, die ci - Box oder die Tester
FinnNk
@FinnNK: Zustimmen - kleine Änderungen sollten nicht zu großen Änderungen führen. Das heißt, die Testfälle wurden von jemandem geschrieben, der nicht mit den Entwicklern in Kontakt steht, die die Änderungen vornehmen - es riecht nach einer Kommunikationslücke.
Talonx
@talonx: UI-Tests sind von Natur aus spröde und dauern viel länger als Unit-Tests. Sie sind eine besondere Herausforderung, daher würde ich nicht zu Schlussfolgerungen über Entwickler in @ Sams Organisation gelangen.
Azheglov
2
Ich habe den Titel geändert - hoffentlich etwas repräsentativer für die Frage und etwas weniger negativ.
Jon Hopkins

Antworten:

7

Der Zweck von Selenium besteht darin, UI-gesteuerte Integrationstests zu erstellen .

Integrationstests stellen sicher, dass alle Komponenten Ihres Systems bei gemeinsamer Bereitstellung ordnungsgemäß funktionieren. Integrationstests sind keine ausreichende Teststrategie und ergänzen andere Teststrategien mit einem anderen Schwerpunkt, z. B. Unit-Tests und Abnahmetests .

UI-gesteuerte Tests sind von Natur aus spröde, obwohl Selen und Watir gegenüber den Anfängen der Aufnahme- und Wiedergabetools einen Schritt weiter sind . Es gibt verschiedene Möglichkeiten, um mit diesem Problem umzugehen. Hier finden Sie eine Zusammenstellung von Ratschlägen einiger Experten von Weltklasse:

Versuchen Sie nicht, Ihre gesamte Testabdeckung aus dieser Art von Tests zu erhalten . Robert C. Martin argumentiert, dass Ihre Codeabdeckung durch Integrationstests etwa 20% betragen sollte . Es ist einfach unpraktisch, alle Ausführungspfade zu testen, wenn die Eingabe mehrere Anwendungsebenen entfernt ist.

Holen Sie sich den größten Teil der Testabdeckung aus Einheiten- und Abnahmetests . Suchen Sie in FinnNks Antwort nach Links zu den Artikeln von Gojko Adzic . Adzic argumentierte wiederholt über das Testen der Geschäftslogik durch Akzeptanztests und das Umgehen der Benutzeroberfläche.

Es müssen jedoch noch einige UI-gesteuerte Tests geschrieben werden . Hier benötigen Sie einige praktische Ratschläge zusätzlich zu "Testen Sie Ihre Geschäftslogik nicht über die Benutzeroberfläche". Ich würde Patrick Wilson-Welshs Blog als Ausgangspunkt empfehlen .

Azheglov
quelle
Der Link für patrickwilsonwelsh.com funktioniert nicht mehr und andere Ressourcen dafür .. !!
MarmiK
4

Das Wichtigste beim Erstellen solcher Tests, sobald Sie eine triviale Zahl überschritten haben, ist die Idee einer symmetrischen Änderung. Eine kleine Änderung des Codes sollte zu einer kleinen Änderung der Testsuite führen.

Angenommen, Sie erfassen in 100 Tests den Namen einer Person mit zwei Textfeldern. Wenn Sie diese Tests niavely schreiben (oder möglicherweise die Wiedergabe von Aufzeichnungen verwenden), müssen Sie 100 Tests ändern. Wenn Sie stattdessen einen Schritt zum Eingeben des Namens abstrahieren und diesen in Ihren Tests verwenden, anstatt Selen direkt zu verwenden, haben Sie nur einen Platz, um Ihre Änderung vorzunehmen. Es hängt von Ihrem Kontext ab, wie viele Abstraktionsebenen Sie verwenden. Die Verwendung der Abstraktion trägt jedoch wesentlich dazu bei, dass Ihre Tests wartbar sind.

Eine zweite wichtige Sache ist, sicherzustellen, dass Ihre Selektoren auf der Sache basieren, die am wichtigsten ist und sich am wenigsten ändert. Manchmal ist dies eine ID oder eine Klasse oder es kann sich um den Text in oder um ein Element handeln. Bevorzugen Sie immer den einfachsten Selektor (z. B. eine ID), aber manchmal müssen Sie etwas wie xpath verwenden, um dies zu erreichen.

Gojko Adzic hat in seinem Blog viele gute Ratschläge, wenn es um diese Art von Tests geht - lesen Sie seinen Todessinus und wie Sie ihn besonders vermeiden können .

FinnNk
quelle
Gute Tipps FinnNk - Ich habe gängige Methoden abstrahiert (Anmelden, Suchen nach Seitenleisten-Widgets usw.) - damit der Schaden verringert wird, wenn sich Tests ändern. Leider verwenden wir ein Propriety-System, das einige der Widgets erstellt und IDs für Widgets basierend auf ihrer Position im Dom erstellt. Wenn also etwas verschoben wird, werden Tests unterbrochen.
Sam J
1
Normalerweise finden Sie eine Möglichkeit, ein Element zu identifizieren - vielleicht einen Text, den dieses Element enthält, oder vielleicht hat es immer die gleiche relative Position zu etwas anderem. Als letzten Ausweg können Sie schließlich auch benutzerdefinierte Locator-Strategien zum Lokalisieren von Elementen mithilfe von Selen definieren, die Ihnen die volle Kontrolle geben (z. B. wenn Sie nach Elementen suchen, deren Name Basisname und am Ende einige willkürliche Elemente hinzugefügt wurden, wie in Ihrem Fall oder in asp.net Webforms).
FinnNk
1

Durch Testen wird sichergestellt, dass sich der Code wie erwartet verhält. Wenn Ihre Tests regelmäßig unterbrochen werden, testen die Tests entweder nicht das Richtige oder die Entwickler kümmern sich nicht um die Tests.

Persönlich denke ich, dass, wenn das Vorhandensein eines <div>Tags einen Test unterbricht, der Test unnötig streng von den umgebenden Tags abhängt und ein milderer Ansatz gewählt werden sollte.


quelle