ich mich in der gleichen Sache bin auf der Suche, und zu einem gewissen Grad hatte ich gehofft, dass Sie eine Antwort für mich zu dieser Frage haben würden. :-)
Nachdem gesagt, dass Winkelmesser ist neu genug, dass niemand wirklich die Antwort kennt, und ich denke, das macht meine Antwort so gut wie die nächsten Personen.
Zunächst verwende ich die Seite Object Notation, die auf dem Transporteur beschrieben Seite der ersten Schritte, nach unten hin: https://github.com/angular/protractor/blob/master/docs/getting-started.md
Das gibt ein Element der Modularität, hier meine Meinung ist, dass ich mit einem Ende Reihe von Klassen, eine pro Seite, die einige der Details abstrahieren. So könnte ich zum Beispiel eine "foo" Klasse haben, die Abstraktionen wie "foo.get" und "foo.validate (id, name, otherData)" enthält. Dies wäre eine Möglichkeit, wiederholten Code herauszuziehen.
Das Bit, das ich nicht ausgearbeitet habe, ist, wie man eine Bibliothek von Modulen erstellt und diese dann zu einem einzigen Satz von Szenarien zusammensetzt. Ich habe ein paar Gedanken aber:
- Das zugrunde liegende Problem ist die Fähigkeit, Javascript-Dateien in einander zu integrieren - die wirklich nicht als eine Fähigkeit existiert. Es gibt Bibliotheken von Drittanbietern, die ich lieber nicht benutzen würde, und ich habe keine Möglichkeit gesehen, die Modulfähigkeit von Angular dafür zu nutzen.
- End-2-Endtest kann sehr von der Reihenfolge der Tests abhängig sein. So kann ein Test Daten erzeugen, ein anderer Test kann diese Daten dann verwenden. Wenn Sie beispielsweise einen Test verwenden möchten, bei dem Personen angemeldet sind, benötigen Sie möglicherweise einen Test, bei dem zuerst Personen registriert werden. Wahrscheinlich möchten Sie die Registrierung nicht bei jedem Test, den Sie ausführen, in den Vordergrund stellen. Daher benötigen Sie wahrscheinlich eine Menge Kontrolle über die Reihenfolge Ihrer Testszenarien.
- Als solche ist eine Option, einfach alles in eine wirklich große Datei zu stellen. Was gegen alles ist, was wir alle in der Schule gelernt haben, aber ich habe nicht wirklich einen Grund gefunden, der nicht funktionieren würde. Dann können Sie Funktionen und Abstraktionen nach Herzenslust schreiben.
- Wenn Sie dies zur nächsten Stufe folgen, besteht eine andere Möglichkeit darin, eine Reihe von Javascript-Dateien mit strengen Namenskonventionen zu schreiben, dann verwenden Sie grunt, um sie für Sie zu verketten, bevor Sie sie ausführen. So zum Beispiel:
- Eine Reihe von Dateien mit dem Namen xxxx.page.scenario.js, die die „Seitenobjekt“ Definitionen enthalten - im Grunde Hilfsmethoden für jede Seite
- Eine Reihe von Dateien mit dem Namen xxxx.functions.scenario .js, die gemeinsame Komponenten Ihrer Szenarios enthalten - also haben Sie möglicherweise eine Register- und Anmeldungsmenge von Aktionen, und Sie machen diese in eine Bibliotheksfunktion
- Eine Reihe von Dateien namens nnxx.scenarios.scenario.js, die die tatsächliche Skripte selbst.Diese werden zu Beginn (die nn) nummeriert, so dass wir sie in einer zuverlässigen Folge verketten und dadurch steuern, die bestellen Sie unsere Skripte laufen
Ich bin noch nicht sagen, das ist eine gute Idee, nur dass es zumindest oberflächlich aussieht, als könnte es funktionieren, und würde das gewünschte Ergebnis geben. Mein Hauptanliegen ist, dass es sich zerbrechlich anfühlt. Wenn die Testsuite größer wird, wird sie vielleicht sehr schwierig zu warten sein. Eine andere Möglichkeit wäre, anstatt die Szenarien zu nummerieren, diese stattdessen als Abhängigkeiten zu definieren und sicherzustellen, dass jedes Skript nach einem Skript ausgeführt wird, von dem es sich selbst abhängig macht. Das würde vielleicht auch eine Teilmenge der Skripte erlauben - also könnte man sagen "führe das Bar-Skript aus" und das Framework würde wissen, dass das Bar-Skript zuerst das foo-Skript ausführen muss und vielleicht das Login-Skript. Aber es ist in Ordnung, alle anderen Skripte auszulassen.
EDIT: Ich sehe Astrolabium als potentiell eine gute Antwort hier, es sieht aus wie es ausdrücklich erlaubt Ihnen, Ihre Tests zu modularisieren. https://github.com/stuplum/astrolabe. Ich habe gerade einen Proof of Concept damit abgeschlossen und es scheint alles zu tun, was ich hoffen könnte. Der Code für es am Ende so etwas wie:
clubs.part.scenario.js:
/**
* Partial for the page objects associated with clubs
*/
var Page = require('astrolabe').Page;
module.exports = Page.create({
url: { value: 'UI/index.html#clubs' },
title: { get: function() { return this.findElement(this.by.id('title')); } },
description: { get: function() { return this.findElement(this.by.id('description')); } },
clubTableElement: { value: function(rowNum, columnBinding) {
return this.findElement(this.by.repeater('club in clubs').row(rowNum).column(columnBinding)); } }
}
);
clubs.scenario.js:
/**
* End to end tests for the club functionality
*/
var homePage = require('../home/home.part.scenario.js');
var clubsPage = require('./clubs.part.scenario.js');
describe('Navigate to club list page', function() {
it ('should allow navigation to the club list page', function() {
homePage.go();
expect(homePage.clubsLink.getText()).toEqual('Clubs');
homePage.clubsLink.click();
expect(clubsPage.title.getText()).toEqual('Club functions');
expect(clubsPage.description.getText()).toEqual('Soon this will show a list of all the clubs, based on information from the server');
expect(clubsPage.clubTableElement(0, 'name').getText()).toEqual('First club');
expect(clubsPage.clubTableElement(0, 'contact_officer').getText()).toEqual('A Person');
expect(clubsPage.clubTableElement(1, 'name').getText()).toEqual('Second club');
expect(clubsPage.clubTableElement(1, 'contact_officer').getText()).toEqual('J Jones');
});
it ('should allow us to go directly to the club list page', function() {
clubsPage.go();
expect(clubsPage.title.getText()).toEqual('Club functions');
expect(clubsPage.description.getText()).toEqual('Soon this will show a list of all the clubs, based on information from the server');
expect(clubsPage.clubTableElement(0, 'name').getText()).toEqual('First club');
expect(clubsPage.clubTableElement(0, 'contact_officer').getText()).toEqual('A Person');
expect(clubsPage.clubTableElement(1, 'name').getText()).toEqual('Second club');
expect(clubsPage.clubTableElement(1, 'contact_officer').getText()).toEqual('J Jones');
});
});
Ich bin ziemlich glücklich mit dieser Struktur, Es macht nicht alles, aber es macht die meisten Dinge. Der Beispielcode, den ich zur Verfügung gestellt habe, stammt aus dem Tutorial, mit dem ich seit einiger Zeit arbeite, mit angularjs, das ich gerade für e2e testing und Rails 4 aktualisiere, wenn du den Kontext dazu haben willst: http://technpol.wordpress.com/2013/11/16/5-end-to-end-testing/
hmm .. könnten Sie das näher ausführen? Ich habe begonnen, Winkelmesser zu verwenden, aber ich habe fast keine Erfahrung in Knoten. Muss ich etw konfigurieren? – WeMakeSoftware
@Funtik Sie müssen die Methoden innerhalb der "your-helper-file.js" wie in dieser Antwort hinzufügen: http://Stackoverflow.com/a/5311377/3111930 * Edit: ah okay, Sie antworteten sich :-) – Sebastian