In meinem Framework habe ich POM mit pageFactory Implementierung verwendet, aber jetzt möchte ich sie parallel ausführen kann mir jemand helfen ThreadLocal-Konzept als ich bin neu dazuIch habe POM-Modell, aber wenn parallele Testfälle es manchmal fehlschlägt, so möchte ich ThreadLocal verwenden
Antwort
Stellen Sie sich ein Restaurant vor. Denk an einen Tisch. Eine Tabelle hat keine Möglichkeit, den gleichzeitigen Zugriff zu steuern (wie eine Ampel), so dass sie nicht als Thread-sicher gilt. Wenn es einen einzigen Tisch gäbe, würden alle Gäste um einen Platz kämpfen, wo sie sitzen oder auf einem Stuhl sitzen könnten. Eine Lösung wäre, dass jeder Gast seine eigene Tabelle (Instanzvariable) mitbringt, aber das würde den Platz des Restaurants füllen. Stattdessen haben Sie einen Tisch für jede Gruppe von Gästen. Und solange Sie auf dem Tisch sitzen, haben Sie exklusiven Zugriff darauf. Sobald die Gruppe der Gäste gegangen ist, kann die nächste Gruppe von Gästen darauf zugreifen, so dass es eine gemeinsame Ressource ohne gleichzeitigen Zugriff ist. Die Tabelle im Beispiel ist ein ThreadLocal.
Es gibt zwei Möglichkeiten, den Thread lokal zu initialisieren - mit oder ohne Anfangswert.
Ohne Anfangswert
wenn Sie Worker-Threads haben, die wiederverwendet werden. Sie legen das ThreadLocal fest, wenn die Taskausführung beginnt, und löschen es gegebenenfalls.
static ThreadLocal<YourType> LOCAL = new ThreadLocal<>();
void beginWork() {
LOCAL.set(yourTypeInstance);
}
Mit Anfangswert
, wenn Sie sicherstellen wollen, dass der Wert initialisiert und der Wert selbst ist nicht kontextuellen, ähnlich einem Singleton und unterscheidet sich von der Aufgabe Beispiel.
static ThreadLocal<YourType> LOCAL = ThreadLocal.withInitialValue(() -> new YourType());
void beginWork() {
YourType localInstance = LOCAL.get();
}
Wichtig! ThreadLocal ist ein Konzept für gemeinsame Werte und sollte immer statische Referenzen sein, die Verwendung von nicht-statischen Referenzen könnte ziemlich schlechte Speicherverluste (Instanz pro Objekt und per-Thread) führen.
Während Singletons freigegebene Ressourcen mit gleichzeitiger Zugriffsoption sind, sind Thread Locals freigegebene Ressourcen mit sequenziellem Zugriff. Objekte im lokalen Thread müssen nicht Thread-sicher sein. Technisch werden die threadlokalen Objekte in einem speziellen Bereich des Speichers gehalten, zu dem nur der Thread exklusiven Zugriff hat.
Für Ihre konkrete Frage, ein Thread lokaler Sinn für Ihre Fabrik machen würde, wenn
- Ihr Werk nicht sicher ist, fädelt
- Ihre Fabrik hat einen Zustand, der nicht unter den Threads gemeinsam genutzt werden soll
Wenn Sie Thread lokal dafür verwenden, verwenden Sie die Option mit Initialwert, um die Fabrik einmal pro verwendetem Thread zu erstellen
Angesichts der Informationen yo Wenn ich Ihnen zur Verfügung stehe, würde ich vorschlagen, stattdessen die Threadsicherheitsprobleme zu beheben. Das POM sollte durch Tests leicht wiederverwendbar sein und keinen gemeinsamen Status haben (statischer Zugriff). Das Gleiche gilt für die Fabrik. Und Sie sollten auch einen separaten WebDriver pro Thread verwenden, aber es sollte völlig in Ordnung sein, einen Test pro Instanz als Instanzvariable zu erstellen, ohne einen lokalen Thread zu verwenden und ihn dem POM zuzuordnen.
Aber keine Regel ohne Ausnahme, auf die Umsetzung je nach Modell, können Sie es um einen aktuellen Kontext entwickelt haben, die einen Verweis auf den aktuellen Treiber hält, so könnte man eine statische Getter-Methode für den Fahrer haben. In diesem Fall ist ThreadLocal der richtige Weg.
class TestContext {
static ThreadLocal<WebDriver> CURRENT_DRIVER = ThreadLocal.withInitialValue(() -> new FirefoxDriver());
static WebDriver currentDriver(){
return CURRENT_DRIVER.get();
}
}
//your POM
class LoginPage {
void login(String username) {
TestContext.currentDriver().getElementById(...).sendKeys(username);
//...
}
}
- 1. Ich möchte ZK in Jsp integrieren, aber ich habe Fehler
- 2. wenn ich Ereignis geklickt habe, möchte ich die Textfarbe ändern
- 3. Ich habe Apache POI heruntergeladen, aber wenn ich versuche, es zu verwenden, kompiliert mein Code nicht
- 4. Wenn die Anzahl der Benachrichtigungen Null ist, möchte ich, was ich gerade habe (Box), aber wenn es nicht Null ist, möchte ich Box in Badge mit Benachrichtigung Count
- 5. Timeout wenn ich file_get_contents() verwenden möchte
- 6. Git dienen: Ich möchte es so einfach
- 7. Ich möchte ein Overlay für den UIImagePickerController verwenden, aber ich möchte die Shutter-Animation
- 8. Ich habe ein Inventar ausgezogen, wenn ich "i" drücke, aber ich möchte wissen, wie man es loswerden kann, wenn ich "i" Agian
- 9. Ich habe eine App, die ich für Lion gemacht habe, aber ich möchte es auf Mac OS-Versionen so niedrig wie 10.4
- 10. Ich möchte etwas machen, wenn ich es bearbeite EditText
- 11. Ich möchte auf einen JPanel verweisen, den ich erstellt habe
- 12. Kann ich VS2010 ENG verwenden, wenn ich anderenlang Lincense habe?
- 13. Warum sollte ich WndProc verwenden, wenn ich Formularereignisse habe?
- 14. Ich möchte E-Mail-Adresse von twitter API mit C# bekommen. Ich habe es versucht, aber es wirft einige Ausnahmen
- 15. Wenn ich die Index.jsp ausführen, habe ich so viele Fehler
- 16. Ich möchte javax jms verwenden
- 17. Ich möchte Elemente eines Arrays als Variablen verwenden, aber wie?
- 18. Javascript Zeichenfolge Vergleichen == manchmal fehlschlägt
- 19. Ich möchte eine Bitmap verwenden Picasso aber scheitern
- 20. ZonedDateTime: Ich möchte, dass parse() bei ungültigem Datum fehlschlägt
- 21. Wenn ich zwei Tabellen habe, möchte ich die Join-Operation verwenden, und wenn ich links beitreten möchte, was ist dann der richtige Join?
- 22. Pexpect manchmal getroffen, manchmal fehlschlägt und bei Timeout
- 23. Ich möchte SQL Server Datensätze zu asp.net mit Ajax jQuery bekommen, aber ich habe nicht
- 24. Wie mache ich das in eckigen? Ich habe einen $ scope.photos, aber ich möchte die h1 die Kategorie zeigen, wenn es anders existiert anzuzeigen „Explore“
- 25. Warum muss ich Speicher aufräumen, wenn ich ein IBOutlet mit "behalten" habe, aber nicht, wenn ich eins mit "zuweisen" habe?
- 26. Picasso: möchte ein Bild zwischenzuspeichern ohne Anzeige es .so, dass ich es später verwenden können
- 27. Ich möchte InputMismatchException fangen, aber es zeigt Zeitfehler
- 28. Ich habe Galerie metabox erstellt, aber es nicht
- 29. Ich habe Funktion, aber in Firebug Konsole sagt es nicht eine Funktion, wo ich es nenne?
- 30. EF baut EntityCollection, aber ich (glaube ich) möchte IQueryable
hi @ Gerald danke für Sie wertvolle Erklärung. Jedes Mal, wenn man eine einzelne Methode aufruft, ist das keine gute Idee. Ich muss lokale Thread-Struktur implementieren, indem ich meinen WebDriver in der Basisklasse initialisiere und der in POM wiederverwendbar sein kann. Kann ich stattdessen "@BeforeMethod" TestNG Annotation verwenden? –
sicher, es ist die Option ohne Anfangswert (siehe oben) –
Lets macht Dinge einfach, wenn ich meinen Treiber statisch initialisieren ThreadLocal driver = new ThreadLocal (); @BeforeAnnotation public WebDriver getDriver() {driver.get(); } Wie wird es in meinen Unterklassen funktionieren? –