Новый Bean каждый @Test

голоса
0

Я создаю Framework Test Appium для гибридного приложения с использованием Spring бутсу 2.0.1 и у меня возникают проблемы с использованием TestExecutionListeners весны.

Цель: Инициализировать новый AppiumDriver<WebElement>экземпляр для каждого теста , помеченного JUnit - х @Testи выйти из этих экземпляров драйверов с помощью AppiumDriver - х quit()после каждого испытания.

Структура моей фреймворки: Я создал пользовательскую область под названиемTestScope

public class TestScope implements Scope {

    private Map<String, Object> scopedObjects = Collections.synchronizedMap(new HashMap<String, Object>());
    private Map<String, Runnable> destructionCallbacks = Collections.synchronizedMap(new HashMap<String, Runnable>());

    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        if (!this.scopedObjects.containsKey(name)) {
            this.scopedObjects.put(name, objectFactory.getObject());
        }
        return this.scopedObjects.get(name);
    }

    @Override
    public String getConversationId() {
        return null;
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
        this.destructionCallbacks.put(name, callback);
    }

    @Override
    public Object remove(String name) {
        this.destructionCallbacks.remove(name);
        return this.scopedObjects.remove(name);
    }

    public void reset() {
        this.scopedObjects.clear();
    }

    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }
}

Зарегистрироваться TestScopeв моем файле конфигурации приложения (Application.java), создавая одноэлементный экземпляр этого, а также регистрации мой AppiumDriver<WebElement>Bean и придав ему вновь созданный testобъем:

@SpringBootApplication
@PropertySource(classpath:application.properties)
public class Application implements EnvironmentAware {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CustomScopeConfigurer customScopeConfigurer() {
        CustomScopeConfigurer scopeConfigurer = new CustomScopeConfigurer();
        Map<String, Object> scopes = new HashMap<>();
        scopes.put(test, this.testScope());
        scopeConfigurer.setScopes(scopes);
        return scopeConfigurer;
    }

    @Bean
    @Scope(test)
    public AppiumDriver<WebElement> driver() {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, this.env.getProperty(platformName));
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, this.env.getProperty(platformVersion));
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, this.env.getProperty(deviceName));
        caps.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT,
                Integer.parseInt(this.env.getProperty(newCommandTimeout)));
        caps.setCapability(MobileCapabilityType.AUTO_WEBVIEW, true);
        // Android Capabilities
        if (this.env.getProperty(platformName).equals(Android)) {
            caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, this.env.getProperty(androidAppPackage));
            caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, this.env.getProperty(androidAppActivity));
        }
        try {
            return new AppiumDriver<WebElement>(new URL(http://127.0.0.1:4723/wd/hub), caps);
        } catch (Exception e) {
            throw new BeanCreationException(driver, Failed to create Driver, e);
        }
    }

    @Bean
    public TestScope testScope() {
        return new TestScope();
    }
}

После этого я создаю мой AbstractTestBaseс соответствующими аннотациями конфигурации. , Как мои тесты будут сделаны в том , что они должны простираться от AbstractTestBaseтак что они наследуют конфигурацию , и поэтому их испытание создавать новые AppriumDriverinstaces для каждого теста:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = Application.class)
@TestExecutionListeners({ AppiumTestExecutionListener.class, DependencyInjectionTestExecutionListener.class })
public abstract class AbstractTestBase {

  @Autowired protected PageObject1 pageObj1;
  @Autowired protected PageObject2 pageObj2;
}

И, наконец, в AppiumTestExecutionListenerтом , что я поставил по моему AbstractTestBase, я написал логику опустошить мой TestScopeэкземпляр перед каждым испытанием, и бросить экземпляр AppiumDriver после каждого теста, так что , когда beforeTestMethod()вызывается с помощью 2 - го испытания, она очищает TestScope и весна вынуждены создать новый экземпляр драйвера, но по какой - то причине первый тест работает нормально, а второй не может говорить мне , сеанс был прерван.

public class AppiumTestExecutionListener extends AbstractTestExecutionListener {

    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
        testContext.getApplicationContext().getBean(AppiumDriver.class).quit();
    }

    @Override
    public void beforeTestMethod(TestContext testContext) throws Exception {
        testContext.getApplicationContext().getBean(TestScope.class).reset();
    }
}

Не уверен , если это то , что происходит, но , кажется , что , когда я @Autowireмой водитель в моих страниц объекты и второй тест работает, как - то экземпляр драйвера никогда не закачивается , так что они используют новый экземпляр? Во всяком случае, я хотел бы видеть , если вы , ребята , знаете , если я устанавливаю что - то неправильное взятие в подсчет , что я пытаюсь достичь здесь.

Задан 07/11/2018 в 20:00
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more