Java 如何调用JUnit测试作为另一个测试的设置?

Java 如何调用JUnit测试作为另一个测试的设置?,java,selenium,selenium-webdriver,junit,Java,Selenium,Selenium Webdriver,Junit,我正在尝试创建一个JUnit测试,它要求用户使用管理员帐户登录。 为了避免重复代码,我做了LoginJUnit测试和GoToAdminPageJUnit测试 第一个访问登录页面并登录 第二个菜单试图进入一个只有管理员才能访问的菜单,它的目的是在第一个菜单关闭的地方选择菜单。我想要的是GoToAdminPage从与Login结束时非常相同的页面和环境开始 这个想法是,通过创建一个登录自动测试,我可以将它重新用于将来需要管理员权限的任何测试 我想做的是,在GoToAdminPage的setUp(

我正在尝试创建一个JUnit测试,它要求用户使用管理员帐户登录。 为了避免重复代码,我做了
Login
JUnit测试和
GoToAdminPage
JUnit测试

  • 第一个访问登录页面并登录
  • 第二个菜单试图进入一个只有管理员才能访问的菜单,它的目的是在第一个菜单关闭的地方选择菜单。我想要的是
    GoToAdminPage
    从与
    Login
    结束时非常相同的页面和环境开始
这个想法是,通过创建一个
登录
自动测试,我可以将它重新用于将来需要管理员权限的任何测试

我想做的是,在
GoToAdminPage
setUp()
中,调用第一个测试。 但是,它会为
GoToAdminPage
启动一个测试浏览器,然后立即为
Login
启动另一个测试浏览器,该浏览器会在
Login.tearDown()
包含
driver.quit()
指令后关闭

我想要的是
GoToAdminPage
希望在同一页面上拾取
Login
结束,它没有
get
指令,因此它永远不会离开开始的Firefox页面

我已经试过几种方法了。我的每个测试都继承了
BasicTest
类,该类定义了许多东西(WebDriver、JS Executor、通用实用程序函数等)。在那个类中,我创建了一个
perform()
函数,该函数调用
setUp()
test()

这样,在
GoToAdminPage
中,我所要做的就是在
GoToAdminPage.setUp()
中调用
Login.perform()
,从技术上讲,这将实现我想要做的事情。但是,它没有,并且具有与我上面提到的相同的效果

通过在线查看,我发现我也可以这样做,
GoToAdminPage扩展Login
,但结果也是一样的

最后,我尝试将整个
Login.test()
过程放在
Login
类中的一个单独函数中,我可以在
GoToAdminPage
中调用该函数,但结果相同

总之,似乎发生的是,当我在
GoToLoginPage
中调用另一个JUnit测试时,它执行测试,但作为单独的测试执行

我想要的是能够基本上使所有这些都成为一个大测试,在这里,一旦我调用了
登录
,我就可以与登录后的页面交互,让我的用户登录。 本质上,我只希望
GoToAdminPage
成为
Login
过程的扩展

这可能吗

这是我目前的代码:

Login.java

public class Login extends BasicTest {

    /**
     * @throws java.lang.Exception
     */
    @Before
    public void setUp() throws Exception {
        super.setUp();
        driver.get(constants.connectionUrl);
    }

    /**
     * @throws java.lang.Exception
     */
    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Test
    public void test() throws Exception {
        this.login(driver);
    }

    public void login(WebDriver d) throws InterruptedException {
        ...login process using webdriver....
    }
}
GoToAdminPage.java

public class GoToAdminPage extends BasicTest {

    Login Login = new Login();
    /**
     * @throws java.lang.Exception
     */
    @Before
    public void setUp() throws Exception {
        super.setUp();
        Login.login(driver);
    }

    /**
     * @throws java.lang.Exception
     */
    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Test
    public void test() throws Exception {
        ...post login test process...
    }
}
然而,这仍然具有上述效果。

将“登录”步骤定义为常规方法(不使用
@Test注释)。然后,您可以从任何地方调用该方法。从您的登录测试方法(在执行步骤后添加所需的断言)和任何
设置
方法,而不实际运行登录测试。

您应该应用,并创建登录对象页面

Web自动化中最流行的模式之一是所谓的 页面对象模式。为了理解模式的主要目标, 首先,您需要考虑web自动化测试在做什么。他们 导航到不同的网页,然后在不同的元素中单击/键入。 页面对象模式包装所有元素、操作和验证 发生在一个页面上的单个对象-页面对象

页面对象模式的一些优点如下所示

  • 减少代码的重复
  • 使测试更具可读性和健壮性
  • 提高了测试的可维护性
IMHO在测试用例之间创建依赖关系不是一个好的实践

例如:

import org.openqa.selenium.WebDriver;
导入org.openqa.selenium.WebElement;
导入org.openqa.selenium.support.FindBy;
导入org.openqa.selenium.support.PageFactory;
公共最终类登录页{
@FindBy(id=“用户名”)
私有WebElement用户名;
@FindBy(id=“密码”)
私有WebElement密码;
@FindBy(id=“loginBtn”)
私有网页元素提交;
公共登录页面(WebDriver){
PageFactory.initElements(驱动程序,this);
}
公共作废提交(字符串用户名、字符串密码){
this.username.sendKeys(用户名);
this.password.sendKeys(密码);
提交。单击();
}
}

最后我找到了解决方案:

  • GoToAdminPage
    extends
    Login

  • GoToAdminPage.setUp()
    调用
    parent.setUp()

  • GoToAdminPage.test()
    调用
    parent.test()


使用这个,我可以让我的第二个测试使用它的父级作为设置阶段。

这就是我所做的。我在我的
login
类中定义了一个
login()
方法,我在
login
中调用了
@Test
方法,在
GoToAdminPage
中调用了
@Before
方法。我将把代码放在OP中。不幸的是,我正在从事一个项目,在这个项目中,页面由动态元素组成,除了登录页面之外,任何页面都不能保证存在。因此,我的测试必须在每个模块的基础上编写。尽管如此,我仍然可以调整POP来处理模块而不是页面。这就是我正在做的事情。推荐的许多实践——防止代码重复和增加泛型测试数量的泛化和分解——我正计划使用,并且将使用。感谢您通过
注释查找
,这将非常有帮助。