2015-10-11 2 views
1

Я пытаюсь использовать picocontainer для DI, но все же получаю свой общий объект, созданный несколько раз, вместо автоматического управления в качестве одноэлементного. Вот пример для иллюстрации. Классы ASteps и BSteps получают экземпляр SharedObject через свои конструкторы. Я ожидал, что это будет управляться как однотонный пикоконтейнер: экземпляр только один раз, согласно документам Cucumber. Вместо этого, я вижу, он получает экземпляр раз для ASteps и один раз для BSteps:picocontainer для singleton DI

Running my.domain.CucumberRunTest 
INFO [main] (CucumberHooks.java:15) - Executing before() 
INFO [main] (SharedObject.java:11) - SharedObject - instantiated 
INFO [main] (ASteps.java:21) - Executing a_step_one() 
INFO [main] (ASteps.java:26) - Executing a_step_two() 
INFO [main] (ASteps.java:31) - Executing a_step_three() 
INFO [main] (CucumberHooks.java:20) - Executing after() 
INFO [main] (CucumberHooks.java:15) - Executing before() 
INFO [main] (SharedObject.java:11) - SharedObject - instantiated 
INFO [main] (BSteps.java:23) - Executing b_step_one() 
INFO [main] (BSteps.java:28) - Executing b_step_two() 
INFO [main] (BSteps.java:33) - Executing b_step_three() 
INFO [main] (CucumberHooks.java:20) - Executing after() 

Что я делаю неправильно? Вот код:

package my.domain; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import cucumber.api.java.en.Given; 
import cucumber.api.java.en.Then; 
import cucumber.api.java.en.When; 

public class ASteps { 

final Logger log = LoggerFactory.getLogger(getClass()); 
SharedObject sharedObject; 

public ASteps(SharedObject sharedObject) { 
this.sharedObject = sharedObject; 
} 

@Given("^A step one$") 
public void a_step_one() { 
log.info("Executing a_step_one()"); 
} 

@When("^A step two$") 
public void a_step_two() { 
log.info("Executing a_step_two()"); 
} 

@Then("^A step three$") 
public void a_step_three() { 
log.info("Executing a_step_three()"); 
} 
} 

************************ 

package my.domain; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import cucumber.api.java.en.Given; 
import cucumber.api.java.en.Then; 
import cucumber.api.java.en.When; 

public class BSteps { 

final Logger log = LoggerFactory.getLogger(getClass()); 
SharedObject sharedObject; 

public BSteps(SharedObject sharedObject) { 
this.sharedObject = sharedObject; 
} 

@Given("^B step one$") 
public void b_step_one() { 
log.info("Executing b_step_one()"); 
} 

@When("^B step two$") 
public void b_step_two() { 
log.info("Executing b_step_two()"); 
} 

@Then("^B step three$") 
public void b_step_three() { 
log.info("Executing b_step_three()"); 
} 
} 

************************ 

package my.domain; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import cucumber.api.java.After; 
import cucumber.api.java.Before; 

public class CucumberHooks { 

final Logger log = LoggerFactory.getLogger(getClass()); 

@Before 
public void before() { 
log.info("Executing before()"); 
} 

@After 
public void after() { 
log.info("Executing after()"); 

} 
} 

********************* 

package my.domain; 

import org.junit.runner.RunWith; 

import cucumber.api.junit.Cucumber; 

@RunWith(Cucumber.class) 
public class CucumberRunTest { 

} 

********************** 

package my.domain; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class SharedObject { 

final Logger log = LoggerFactory.getLogger(getClass()); 

public SharedObject() { 
log.info("SharedObject - instantiated"); 
} 
} 

ответ

2

Кэш контейнера пико является reset между сценариями, когда мир утилизирован в конце сценария.

Это очень за проект, чтобы избежать утечки состояния между сценариями и сделать их изолированными, чтобы порядок испытаний не влиял на результаты.

Если вы хотите сохранить состояние между сценарием A и сценарием B, вам нужно либо самостоятельно обрабатывать SharedObject, либо за пределами контейнера pico, либо вы можете сделать зависимость между этими двумя сценариями явной - например, используя Background ,

+0

Спасибо, Себастьян, это очень полезно. В этом случае я не вижу большого значения при использовании picocontainer (я могу получить тот же результат с обычными старыми локальными переменными). Я создаю платформу автоматизации тестирования и хочу определить различные области применения для разных видов ресурсов: ресурсы с областью сценариев (например, экземпляр WebDriver) или ресурсы с охватом (например, конфигурация выполнения, соединения с БД и другие неизменные или дорогие ресурсы). Мне все еще нужно понять весь жизненный цикл JCM Cucumber. Знаете ли вы какие-нибудь хорошие ресурсы для этого? Или исходный код мой лучший вариант? – Pablo

+0

@Pablo Боюсь, я ничего не знаю - я обычно проверяю источники огурца-jvm. Они, однако, хорошо написаны, так что это несколько легко следовать. Запустите CucumberScenario # run (https://github.com/cucumber/cucumber-jvm/blob/master/core/src/main/java/cucumber/runtime/model/CucumberScenario.java#L36), вот где магия происходит для сценария. –

1

Надеюсь, еще не поздно ответить на ваш вопрос.

Собственно, вы можете иметь то, что хотите. Я видел, что вы также хотите иметь один экземпляр вашего браузера. Для этого вам нужно использовать статические объекты. Я создал небольшой класс, чтобы избежать открытия/закрытия драйвера между каждым тестом. Он управляется пикоконтейнером. В ваших классах stepDefinition вам нужно реализовать «тот же» конструктор.

Вот пример:

public class myStepDefinition{ 
    private Drivers context; 
    public myStepDefinition(Drivers context){ 
     this.context = context; 
     // whatever you want to do 
    } 
} 

public class Drivers { 
    private static boolean initialized = false; 
    private static WebDriver driver; 

    @Before 
    public void initialize(){ 
     if (!initialized){ 
      initialized = true; 
      driver = new FirefoxDriver(); 
      driver.manage().window().maximize(); 
      driver.get("http://www.myurl.url"); 
     } 
    } 

    public static WebDriver getDriver(){ 
     return driver; 
    } 
} 

Имейте в виду, что вы должны вернуться к вам страницу входа или вашу стартовую страницу после каждого теста (прошел или не удалось)

С уважением,

Nicolas

Смежные вопросы