2016-12-07 9 views
0

Я использую огурец с бегуном JUnit. Я тестирую App UI Test с Appium, но это не имеет значения для этого вопроса. Соответствующая часть состоит в том, что я хочу повторно использовать функции и определения шагов в iOS и Android, а передать экземпляр драйвера selenium из JUnit на шаги, так как я только хочу запустить тестовый сервер один раз.Пропустить контекст от JUnit Runner до огуречных шагов

У меня есть что-то вроде этого:

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 
    } 

} 

И почти то же самое для Android в 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 
    } 

} 

Ступени расположены в GenericSteps.java (на данный момент только один файл):

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

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

Как я могу передать driver от CucumberIOSTest/CucumberAndroidTest конструктору шаги?

Проблема в том, что экземпляр CucumberIOSTest/CucumberAndroidTest знает, хочу ли я протестировать теги iOS или Android. GenericSteps не может этого знать. Также я хочу только запустить симулятор один раз для всех тестов на каждой платформе, соответственно.

Я пробовал DI, но я не нашел способ передать экземпляр WebDriver, который я создал в JUnit Runner. Есть идеи?

ответ

1

Я думаю, что самым простым решением является использование Singleton дизайн. DriverFactory всегда должен возвращать тот же экземпляр WebDriver. Поэтому внутри вашего DriverFactory добавьте метод «static WebDriver instance» и getWebDriver().

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; 
    } 
    ... 
}  

теперь ваши GenericSteps кал выглядеть следующим образом:

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

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

Hm, что на самом деле работает, спасибо! Мне просто нужно сбросить экземпляр WebDriver в '@ AfterClass', поэтому он работает правильно, когда я впервые запускаю тесты iOS, а затем тесты на Android. – fabb