Muster für Tester. Proxy (alternativ)

Bevor es soweit ist


Hallo. Ich bin Dima und kenne die Muster nicht. Was den Tester betrifft, um nicht zu sagen, dass er problematisch ist. Wie für einen Automator ..? Nun, seien wir ehrlich, du kannst auch leben.

Aus Chatrooms, Konferenzen und der Kommunikation mit Kollegen wird deutlich: Das Hauptmuster - PageObject - wird gelernt, was wird noch benötigt?

Und hier war ein so großer Teil der Gedanken darüber, warum wir Designmuster nicht wirklich verwenden: Kennen wir sie nicht oder ist es ohne sie gut? Es gab auch Vertiefungen in der Geschichte, dass Muster nicht für Sie sind, sondern seit Jahrzehnten bewährte Kenntnisse und Techniken, Argumente für und Erwähnung von bekannten Genossen, die dagegen sind.

Aber letztendlich wird es definitiv nicht schaden, die Muster zu kennen.

Ich fordere Sie also keineswegs auf, Vorlagen überall in Code umzuwandeln, und beginne, eine Reihe von Artikeln über Muster zu veröffentlichen.

Ein bisschen mehr über das Format und los geht's


Die Artikel / Bücher / Videokurse über Muster selbst sind ziemlich anständig. Und ich bin sicher, Sie können leicht eine Ressource mit einer kompetenten Erklärung, Beispielen für Ihre Lieblings-YP, E-Mails usw. finden.

Die Aufgabe dieses und nachfolgender Artikel ist es, mit denen über Muster zu sprechen, die bereits mit dem Code arbeiten, aber keine gute theoretische Grundlage haben. Diese Artikel sind also vielleicht in erster Linie für mich.

Nun, da ich selbst ein Tester bin und es selbst in meinem Freundeskreis viele der gleichen gibt, werden die Geschichten zur Testautomatisierung neigen.

Einige der Muster scheinen seltsam und nicht sehr nützlich zu sein. Und bei einigen werden Sie im Gegenteil feststellen, dass Sie so etwas schon lange implementiert haben. Sie wussten einfach nicht, dass es so heißt.
Auf jeden Fall hoffe ich, dass Sie etwas Nützliches für sich finden.

Und ja, ich freue mich sehr über konstruktive Kritik in den Kommentaren.

Hier.

  • zu mir selbst - erzählt
  • was wird erzählt
  • warum - erzählt
  • für wen und wie - erzählt

Du kannst anfangen.



Proxy - Proxy - Stellvertreter


Theorie (ein bisschen)


Proxy-Muster (in russischen Ausgaben, Deputy ). Die Idee ist, für die Arbeit kein reales Objekt auszugeben, sondern eine Substitution, die die Methoden des Objekts + unsere Logik verwendet, falls wir eine hinzugefügt haben. Das ist alles.

Wie es geht:

1. Erstellen Sie eine Schnittstelle mit öffentlichen Methoden des Objekts, das wir ersetzen möchten
2. Erstellen Sie eine Klasse, die
- implementiert diese Schnittstelle
- hat Zugriff auf das ursprüngliche Objekt, um seine Methoden aufzurufen
3. Fügen Sie Ihre Logik zu den Methoden der erstellten Klasse hinzu

Übe


In der Praxis sollte es klarer sein.

Dano: Wir haben einen WebDriver. Und er hat eine Methode findElements (By by);

Aufgabe: Ich muss wirklich protokollieren, wie viele Elemente vom Selektor gefunden wurden.
Jedes Mal, wenn ich eine Methode aufrufe

driver.findElements(By.cssSelector(".item")); 

Ich möchte einen Datensatz in den Protokollen sehen - wie viele Elemente gefunden wurden

Lösung 1. Auf der Stirn. Was ist da: Ich habe es benutzt.
Wir nehmen es einfach und schreiben bei jedem Anruf, wie viele gefunden wurden:

 List<WebElement> items = driver.findElements(By.cssSelector(".item")); logger.info("Found {} items", items.size()); 

Die Option ist normal, während solche Aufrufe beispielsweise 7 sind. Obwohl die Nachteile dieses Ansatzes bereits für jeden offensichtlich sind, der mindestens einmal „seinen Code geringfügig geändert“ hat.

Lösung 2. Wir verwenden einen Proxy.
WebDriver ist eine Schnittstelle. Methoden deklariert, aber keine Implementierung. Zu den Implementierungen gehören ChromeWebDriver, FirefoxWebDriver usw.

In Tests müssen wir nicht mit einer bestimmten Klasse für Chrom oder Safari arbeiten. Die Klasse muss nur die WebDriver-Schnittstelle implementieren. Wir werden dies tun:

  1. Wir erstellen eine Schnittstelle mit den öffentlichen Methoden des Objekts, das wir ersetzen möchten
    In unserem Beispiel gibt es bereits eine solche Schnittstelle - WebDriver.
  2. Erstellen Sie eine Klasse, die
    - implementiert diese Schnittstelle
    - hat Zugriff auf das ursprüngliche Objekt, um seine Methoden aufzurufen
     public class LoggerWebDriver implements WebDriver{ private WebDriver driver; public void get(String s) { } public List<WebElement> findElements(By by) { return null; } public WebElement findElement(By by) { return null; } //     } 
  3. Fügen Sie Ihre Logik zu den Methoden der erstellten Klasse hinzu
     public class LoggerWebDriver implements WebDriver { private WebDriver driver; private final Logger logger = LogManager.getLogger(LoggerWebDriver.class); LoggerWebDriver() { //    . // , ()     this.driver = new ChromeDriver(); } public void get(String var1) { driver.get(var1); } public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } public WebElement findElement(By var1) { return driver.findElement(var1); } //     } 

Was ist passiert?

Zur Klasse hinzugefügt

 private WebDriver driver; 

Dies ist das gleiche Objekt, das wir ersetzen möchten. Es sind seine Methoden, die wir weiter nennen werden.

Jetzt können Sie sich beispielsweise die Methode ansehen

 public void get(String var1) { driver.get(var1); } 

Die Methode ruft lediglich get () für den realen Treiber auf.

Und hier ist die Methode

 public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } 

Wir haben uns entsprechend unserer Aufgabe erweitert.

Das ist alles, was Sie in Tests verwenden können:

 WebDriver driver = new LoggerWebDriver(); driver.get("http://google.com"); List<WebElement> items = driver.findElements(By.cssSelector("a")); // => Selector By.cssSelector: a. Found 48 elements 



Hier. Das Muster ist gut, wenn Sie Protokollierung, Caching, verzögerte Initialisierung und Zugriffskontrolle auf Methoden auflegen müssen. Wenn Sie Code schreiben und wirklich eine Art Zwischenschicht mit Ihren Funktionen haben möchten, ist eine der Optionen im Allgemeinen ein Proxy.

Jetzt, da wir noch ein Muster kennen, möchte ich Sie daran erinnern, dass, wenn ein Hammer in Ihrer Hand ist, alles um uns herum Nägel zu sein scheinen. Denken Sie daran.

Source: https://habr.com/ru/post/de414253/


All Articles