Динамически загружать файл определения шага из jar - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть исполнитель Gherkin, где я выполняю свои файлы функций.Я хотел бы добавить файл StepDefinition из другого jar-файла.Пользователь мог бы использовать мой проект с шагом def, который я уже написал, но он также мог бы добавить пользовательские определения из своего собственного файла jar.

В настоящее время у меня есть JavaClassLoader, куда я загружаю свой классиз моей банки, и я использую его в своей основной

public class JavaClassLoader<C> extends ClassLoader {

public C LoadClass(String directory, String classpath, Class<C> parentClass) throws ClassNotFoundException {
    File pluginsDir = new File(System.getProperty("user.dir") + directory);
    for (File jar : pluginsDir.listFiles()) {
      try {
        ClassLoader loader = URLClassLoader.newInstance(
            new URL[] { jar.toURL() },
            getClass().getClassLoader()
        );
        Class<?> clazz = Class.forName(classpath, true, loader);
        Class<? extends C> newClass = clazz.asSubclass(parentClass);
        // Apparently its bad to use Class.newInstance, so we use 
        // newClass.getConstructor() instead
        Constructor<? extends C> constructor = newClass.getConstructor();
        return constructor.newInstance();

      } catch (ClassNotFoundException e) {
        // There might be multiple JARs in the directory,
        // so keep looking
        continue;
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (NoSuchMethodException e) {
        e.printStackTrace();
      } catch (InvocationTargetException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (InstantiationException e) {
        e.printStackTrace();
      }
    }
    throw new ClassNotFoundException("Class " + classpath
        + " wasn't found in directory " + System.getProperty("user.dir") + directory);
  }

}

JavaClassLoader<AbstractStepDefs> loader = new JavaClassLoader<AbstractStepDefs>();  
    loader.LoadClass("/", "stepDef.dynamicClass", AbstractStepDefs.class);  

Проблема в том, что огурец не может прочитать методы, которые я написал в другой банке.Есть ли способ использовать файл step def, которого нет в проекте?

1 Ответ

0 голосов
/ 12 февраля 2019

Есть ли способ использовать файл step def, которого нет в проекте?

Да и нет.Да часть ближе к «вроде».Git поддерживает несколько способов ссылки на подпроекты в других проектах.Общие «подпроекты» поддерживаются в их собственном проекте, а затем включаются в использование проектов.Смотрите здесь для обсуждения.Я смотрел на подмодули один раз.У меня даже было это работает.Но я не смог убедить владельцев TeamCity поддержать его.Это работает, но вы должны быть осторожны с тем, как вы его используете.Есть ненавистников .

В итоге я создал общий глобальный проект, содержащий файлы страниц для общих страниц входа и навигации.Этот глобальный проект также содержал всю поддержку запуска и выключения для различных браузеров и для удаленного выполнения на SauceLabs.

Определения шагов нужно было повторять (чёрт; я предпочитаю DRY ), но они небольшие, так как в основном они просто вызывают методы файла подкачки.Все эти веб-страницы определены в глобальном проекте в своих собственных файлах классов.Общий служебный код определяется в классе WebDriverManager.

@Given("^I navigate to the public ACME WebPage and select Login$")
public void iNavigateToTheAcmePublicWebPage() {
    pageFactory.AcmePublicWebPage().navigateTo(
      WebDriverManager.instance().getAcmeUrl());

    pageFactory.AcmePublicWebPage().closeNotificationPopUp(); //If there is one
    pageFactory.AcmePublicWebPage().selectLoginLink();
}

@When("^I close the browser$")
public void iCloseTheBrowser() {
    WebDriverManager.instance().closeBrowser();
}

Я уменьшил большинство, но не все дублирование.Большинству младших инженеров по автоматизации тестирования не нужно беспокоиться о тяжелой работе, пока я поддерживаю глобальный проект git и уведомляю их, когда им нужно загрузить новый глобальный jar из TeamCity.

...