如何将JUnit测试称为另一个测试的设置?

时间:2019-10-24 16:00:14

标签: java selenium selenium-webdriver junit

我正在尝试创建一个JUnit测试,该测试需要用户使用管理员帐户登录。 为了使其不必重复代码,我完成了Login JUnit测试和GoToAdminPage JUnit测试。

  • 第一个访问登录页面并登录。
  • 第二次尝试访问只有管理员才能访问的菜单,并且是在第一个菜单离开的地方。对于GoToAdminPage,我想要的是从同一页面开始,并以Login结尾的相同环境开始。

这个想法是,通过创建Login自动化测试,我可以将其重用于以后需要管理员权限的任何测试。

我要尝试的是在setUp()的{​​{1}}中调用第一个测试。 但是,这样做是为了启动GoToAdminPage的测试浏览器,然后立即启动GoToAdminPage的另一个测试浏览器,由于Login包含一条Login.tearDown()指令,该浏览器将关闭。 / p>

我想要的是driver.quit(),期望在同一页面上GoToAdminPage结束,它没有Login指令,因此它永远不会离开Firefox的起始页面。

我已经尝试了几件事。我的每个测试都继承了get类,该类定义了许多东西(WebDriver,JS Executor,通用实用程序函数等)。在该课程中,我创建了一个BasicTest函数,该函数调用perform()setUp()

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

在网上看,我发现我也可以做到GoToAdminPage.setUp(),但这也有相同的结果。

最后,我尝试将整个GoToAdminPage extends Login进程放在Login.test()类中的一个单独函数中,我可以在Login内部调用此函数,但是结果是相同的。

总而言之,似乎正在发生的事情是,当我在GoToAdminPage内调用另一个JUnit测试时,它执行测试,但作为单独测试进行。

我想要的是基本上能够进行一次大测试,在这里,一旦我叫GoToLoginPage,我就可以在用户登录后与登录后页面进行交互。 本质上,我只希望LoginGoToAdminPage流程的扩展。

这可能吗?

这是我当前的代码:

Login.java

Login

GoToAdminPage.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....
    }
}

然而,这具有上述效果。

3 个答案:

答案 0 :(得分:0)

将“登录”步骤定义为常规方法(未用@Test注释)。然后,您可以从任意位置调用该方法。从您的登录测试方法(在执行步骤之后添加所需的断言)以及从任何setUp方法开始,而无需实际运行登录测试。

答案 1 :(得分:0)

您应该应用Page Object Pattern,并创建一个登录对象页面。

  

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

下面列出的页面对象模式的一些优点,

  • 减少代码重复
  • 使测试更具可读性和鲁棒性
  • 提高测试的可维护性

恕我直言,在测试用例之间建立依赖关系不是一种好习惯。

例如:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public final class LoginPage {

    @FindBy(id="username")
    private WebElement username;

    @FindBy(id="password")
    private WebElement password;

    @FindBy(id="loginBtn")
    private WebElement submit;

    public LoginPage(WebDriver driver) {
        PageFactory.initElements(driver, this);
    }

    public void submit(String username, String password) {
        this.username.sendKeys(username);
        this.password.sendKeys(password);
        submit.click();
    }
}

答案 2 :(得分:0)

最后,我找到了解决方案:

  • WITH cte AS ( SELECT 'ABC' AS name UNION ALL SELECT 'DEF' UNION ALL SELECT 'ABC' ) SELECT t.name FROM cte t WHERE EXISTS (SELECT 1 FROM stud s WHERE s.name = t.name); 扩展了GoToAdminPage

  • Login呼叫GoToAdminPage.setUp()

  • parent.setUp()呼叫GoToAdminPage.test()

使用此功能,我可以使第二项测试使用其父项作为设置阶段。