我有一个Gherkin执行器,可以在其中执行功能文件。我想做的是从另一个jar添加一个StepDefinition文件。用户可以使用我已经编写的step def来使用我的项目,但他也可以从自己的jar文件中添加自定义定义。
目前,我有一个JavaClassLoader,可从我的jar中加载类,并在我的主容器中使用它
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);
问题在于Cucumber无法读取我在另一个jar中编写的方法。有没有办法使用项目中没有的step def文件?
答案 0 :(得分:0)
是否可以使用项目中没有的step def文件?
是的,不是。是的部分更接近“排序”。 git支持在其他项目中引用子项目的几种方法。常见的“子项目”保留在自己的项目中,然后拉入使用项目。在here中进行讨论。我曾经考虑做一次子模块。我什至让它工作了。但是我无法说服TeamCity所有者支持它。它可以工作,但是您必须谨慎使用它。有haters。
我最终要做的是创建一个共享的“全局”项目,其中包含常见登录页面和导航页面的页面文件。该全局项目还包含对不同浏览器以及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项目并在需要从TeamCity下载新的全局jar时通知他们,大多数初级测试自动化工程师就不必担心繁重的工作。