Ich schreibe eine Testsuite für eine Webanwendung mit TestNG und Selenium WebDriver.TestNG Führen Sie alle Klassenmethoden mehrmals aus, indem Sie @BeforeClass mit den bereitgestellten Daten ausführen.
Was ich brauche ist, dass alle Methoden der Testklasse für verschiedene authentifizierte Benutzer mehrere Male ausgeführt werden (Daten werden zur Laufzeit aus einer DB herausgezogen). Also muss ich Daten an die Klasse mit Datenprovider übergeben, die Anmeldeinformationen aller Benutzer liefert, dann muss ich für jeden Benutzer einen Webtreiber erstellen (für die Reinheit des Experiments) und mit angegebenen Anmeldeinformationen in @BeforeClass
Methode ausführen Alle @Test
Methoden der Klasse und machen eine @AfterClass
abreißen schließen Web-Treiber.
Wie kann ich das tun?
Meine Versuche, dies zu tun sind hier: https://gist.github.com/4246674
Attempt1 eine @Test(dataProvider="getUsersIdAndName")
auf Klasse zu setzen war. Es funktioniert nicht, weil @Test(dataProvider=)
für die Klasse nicht bedeutet, dass alle Methoden der Klasse mit den bereitgestellten Daten aufgerufen werden sollten. Das Ergebnis war, dass die Methode überhaupt nicht aufgerufen wurde, da keine Daten an die Argumente übergeben werden konnten. Und ich bekomme seltsamen Testbericht, wo diese Methode als mit Ausführungszeit von 0 Sekunden übergeben markiert ist. (Es ist ein Maven-Projekt in NetBeans geöffnet, wenn dies sinnvoll ist.)
Ist @Test(dataProvider=)
auf der Klasse bedeutet überhaupt etwas?
Versuch2 war DataProvider auf der @Test
Annotation der Methode hinzuzufügen. Es funktioniert nicht, da die Testmethode während des einzelnen Klassenlaufs zweimal aufgerufen wird. Das Ergebnis war, dass es beim zweiten Mal fehlschlägt, weil es versucht, den Test zu wiederholen, während der Web-Treiber nicht neu initialisiert wurde: Der Browser rendert bereits eine andere Seite.
Auch gibt es Nachteile der ersten und zweiten Versuch, die Anmeldung selbst erfolgt in der Testmethode eher, dass in @BeforeClass
Methode, weil ich keine Möglichkeit kenne, es mit Daten von Datenanbieter zu liefern.
Versuch3 war ein verzweifelter Versuch, @BeforeClass
und @Test
mit der einzigen Methode zu kombinieren. Es funktioniert nicht, da @BeforeClass
auch @Parameters
fordert, wenn eine annotierte Methode eine Parameterliste hat. Das Ergebnis ist, dass diese Methode dreimal aufgerufen wird: zum ersten Mal als ein Klassensetup, wenn es aus dem obigen Grund fehlschlägt, und zweimal wegen des Datenproviders, wenn es erfolgreich ist.
Dann fand ich heraus, dass TestNG keinen Weg nicht bieten alle Klassenmethoden mehrmals mit verschiedenen Daten aufzurufen: http://comments.gmane.org/gmane.comp.java.testng.user/864
Ich habe zwei andere Ideen, wie kann ich den gleichen Effekt zu archivieren.
Idea4 ist eine @Test(dataProvider=)
auf jeder Testmethode zu platzieren, führt jede Methode eine Authentifizierung und isAuthenticated()
Test von selbst und führen Sie dann einen eigenen Test. Ineffektiv und hässlich.
Idea5, das aussieht wie das beste erschwingliche ist mit einer @Test
nur eine Methode zu markieren, die alle anderen Testmethoden aggregiert: es empfängt Daten vom Datenprovider, führt Authentifizierung durch gegebenen Benutzer durch, führt dann isAuthenticated Test und alle anderen notwendigen Tests.In diesem Fall @BeforeClass
und @AfterClass
nur Web-Treiber einrichten und abbauen. Dieser Ansatz hat den Nachteil, dass ich die Möglichkeit verliere, @BeforeMethod
und @AfterMethod
zu verwenden, aber das ist für mich erschwinglich: sieht so aus, als würde ich sie nicht brauchen.
Gibt es eine bessere Möglichkeit, denselben Effekt zu archivieren?
Sorry für lange Nachricht.
Vielen Dank im Voraus.
Danke. Hat geschafft, genau das zu tun, was ich wollte. Platzierte eine '@ Factory' Annotation für den Konstruktor und ließ sie Daten vom Datenprovider empfangen. Jede Instanz der Testklasse stellt jetzt einen Webtreiber dar, der als ein Benutzer angemeldet ist, der eine Reihe von Tests durchführt. Konstruktor lädt Eigenschaften und speichert angegebene Benutzeranmeldeinformationen in Klassenfeldern. Die '@ BeforeClass'-Methode instanziiert den Webtreiber und meldet sich mit den gespeicherten Anmeldeinformationen an. '@ AfterClass' schließt den Web-Treiber. Wenn jemand interessiert ist, ist der vollständige Code hier. – yaromir