2016-12-07 3 views
0

Ich benutze Gurke mit einem JUnit Runner. Ich mache App UI Tests mit Appium, aber das sollte für diese Frage keine Rolle spielen. Der relevante Teil ist, dass ich Features und Schrittdefinitionen über iOS und Android wiederverwenden möchte und die Selen-Treiberinstanz von JUnit an die Schritte übergebe, da ich den Testserver nur einmal starten möchte.Pass Context von JUnit Runner zu Gurke Schritte

Ich habe so etwas wie dies:

login.feature:

Feature: Login 
@android_phone @ios_phone 
Scenario: Successful login 
    Given ... 

CucumberIOSTest.java:

@RunWith(Cucumber.class) 
@CucumberOptions(
     glue = {"classpath:my.stepdefinitions"}, 
     tags = {"@ios_phone,@ios_tablet"} 
) 
public class CucumberIOSTest { 

    private static WebDriver driver; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     // setup code that starts up the ios simulator via appium 
     driver = DriverFactory.createIOSDriver(); 
    } 

    @AfterClass 
    public static void tearDown() { 
     // shutdown ios simulator 
    } 

} 

Und fast das gleiche für Android in CucumberAndroidTest.java:

@RunWith(Cucumber.class) 
@CucumberOptions(
     glue = {"classpath:my.stepdefinitions"}, 
     tags = {"@android_phone,@android_tablet"} 
) 
public class CucumberAndroidTest { 

    private static WebDriver driver; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     // setup code that starts up the android simulator via appium 
     driver = DriverFactory.createAndroidDriver(); 
    } 

    @AfterClass 
    public static void tearDown() { 
     // shutdown android simulator 
    } 

} 

Die Schritte werden in GenericSteps.java (vorerst nur eine Datei):

public class GenericSteps { 
    public GenericSteps(WebDriver driver) { 
     this.driver = driver; 
    } 

    @Given("^...$") 
    public void ...() throws Throwable { 
     ... 
    } 
} 

Wie kann ich die driver von CucumberIOSTest/CucumberAndroidTest an den Steps Konstruktor übergeben?

Das Problem ist, dass nur die CucumberIOSTest/CucumberAndroidTest Instanz weiß, ob ich die iOS- oder Android-Tags testen möchte. Die GenericSteps kann das nicht wissen. Außerdem möchte ich den Simulator nur einmal für alle Tests auf jeder Plattform starten.

Ich versuchte DI, aber ich fand keine Möglichkeit, die WebDriver Instanz zu übergeben, die ich in der JUnit Runner erstellt habe. Irgendwelche Ideen?

Antwort

1

Ich denke, dass die einfachste Lösung ist Verwendung Singleton Design-Muster. DriverFactory muss immer dieselbe Instanz von WebDriver zurückgeben. Fügen Sie in Ihrer DriverFactory die statische WebDriver-Instanz und die Methode getWebDriver() hinzu.

public final class DriverFactory { 
    private static WebDriver instance = null; 

    public static synchronized WebDriver getWebDriver() { 
     if (instance == null) {throw RuntimeException("create WebDriver first")}; 
     return instance; 
    } 
    public static synchronized WebDriver createAndroidDriver() { 
     if (instance == null) { 
     // setup code that starts up the android simulator via appium 
     instance = yourWebDriver 
     } 
     return instance; 
    } 
    ... 
}  

jetzt Ihre GenericSteps cal wie folgt aussehen:

public class GenericSteps { 
    public GenericSteps() { 
     this.driver = DriverFactory.getWebDriver(); 
    } 

    @Given("^...$") 
    public void ...() throws Throwable { 
     ... 
    } 
} 
+0

Hm, das tatsächlich funktioniert, danke! Ich muss nur die WebDriver-Instanz in '@ AfterClass' zurücksetzen, so dass sie korrekt funktioniert, wenn ich zuerst die iOS-Tests und dann die Android-Tests ausführe. – fabb

Verwandte Themen