这对Java来说可能是一项不可能完成的任务,但我想知道是否有任何专业人士都有解决方案。 [自从我使用Java以来已经好几年了,真的很好学院]
我正在构建QA框架。如果没有意义,请提出任何问题或举起任何旗帜。
使用Selenium Webdriver,我们有一个驱动程序类。
public class Driver {
private final String browser;
private final WebDriver driver;
public Driver(String browser) {
driver = new RemoteWebDriver(new URL(Environment_address));
}
我首先提到这个类,因为它需要由运行每个测试用例的测试类和带有其他方法的库使用。 (助手方法)
如
class UserPageUtils{
private final Webdriver driver;
public UserPageUtils(driver){
this.driver = driver;
}
public void makeUsersLifeMiserable(){...}
}
和
class ActionPageUtils{
private final Webdriver driver;
public ActionPageUtils(driver){
this.driver = driver
}
public void doSomethingCoolWithAction(){...}
}
通过这些示例,有没有办法将类合并为单个类或变量?我没想到的设计模式。我有以下内容,我如何安排这样做以便可以进行以下操作,或类似的效果。
public TestSuite extends AverageEverydayTestSuiteLikeTestNG{
@BeforeMethod
public void setUp(Object[] objects) {
HelperUtils utils = merge('ActionPageUtils','UserPageUtils', driver);
// Similarly in psuedo
// HelperUtils utils = merge(new ActionPageUtils(driver), new UserPageUtils(driver));
}
@Test
public void testUserAction(HelperUtil utils){
utils.makeUsersLifeMiserable(); //util has methods from both classes!!
utils.doSomethingCoolWithAction();
assert something is still passing.
}
是否有可能在java中做这样的事情?在一个类中创建两个包装器。我无法绕过结构。我觉得这在bash或其他方面更有可能,但不确定Java是否可以做这样的事情。
如何实施或将如何实施?
使用[Java,Selenium,Groovy]
答案 0 :(得分:1)
使用如下所示的Facade Pattern,而不是合并,你可以调用构造函数,HelperUtils类就像这样。
public class HelperUtils {
ActionPageUtils actionPageUtils;
UserPageUtils userPageUtils;
public HelperUtils(ActionPageUtils actionPageUtils, UserPageUtils userPageUtils, Webdriver driver) {
this.actionPageUtils = actionPageUtils;
this.userPageUtils = userPageUtils;
}
public void doSomethingCoolWithAction(){actionPageUtils.doSomethingCoolWithAction();}
public void makeUsersLifeMiserable(){userPageUtils.makeUsersLifeMiserable();}
public static void main(String[] args) {
HelperUtils utils = new HelperUtils(new ActionPageUtils("Chrome"), new UserPageUtils("firefox"), driver);
utils.makeUsersLifeMiserable();
utils.doSomethingCoolWithAction();
}
}
这种方法的缺点:
无论何时更新子类或合并类,都要创建新方法。
答案 1 :(得分:0)
Java没有多重继承。您可以通过多种方式完成您想要的任务:
Pure Interfaces:
interface UserPageUtils{
public void makeUsersLifeMiserable();
}
interface ActionPageUtils{
public void doSomethingCoolWithAction();
}
class PageUtils implements UserPageUtils, ActionPageUtils {
//concrete implementations
}
立面图案:
class UserPageUtils{
private final Webdriver driver;
public UserPageUtils(driver){
this.driver = driver;
}
public void makeUsersLifeMiserable(){...}
}
class ActionPageUtils{
private final Webdriver driver;
public ActionPageUtils(driver){
this.driver = driver
}
public void doSomethingCoolWithAction(){...}
}
class PageUtils{
private final Webdriver driver;
private final ActionPageUtils action;
private final UserPageUtils user;
public void doSomethingCoolWithAction(){action.doSomethingCoolWithAction();}
public void makeUsersLifeMiserable(){user.makeUsersLifeMiserable();}
}
或者,如果您使用的是Java 8,则可以在界面中使用默认方法:
interface UserPageUtils{
public Webdriver getDriver();
default void makeUsersLifeMiserable(){
//somewhere here you use getDriver();
}
}
interface ActionPageUtils{
public Webdriver getDriver();
default void doSomethingCoolWithAction() {
//somewhere here you use getDriver();
}
}
class PageUtils implements UserPageUtils, ActionPageUtils {
private final Webdriver driver;
@Override
public Webdriver getDriver() {
return driver;
}
}
答案 2 :(得分:0)
我可以想到两种方法。
一个可以使用装饰器设计模式,另一个可以使用命令和宏命令设计模式。
使用装饰器,您可以将HelperUtils作为主类,然后其他Utils可以装饰它。您可以使用不同的装饰器进行不同的测试,并为您的测试提供灵活性并重用您的Util。
使用另一种方法,您可以让每个Utils实现一个Command接口。然后,为每个测试定义宏命令,这样它的“执行”方法就会调用你想要的每个Utils的每个“execute”方法。
根据我的理解,我会首先选择装饰器方法,但如果装饰器不能满足你的需要,另一个方法也会有用。
希望它有所帮助。