我正在尝试创建一个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
,我就可以在用户登录后与登录后页面进行交互。
本质上,我只希望Login
是GoToAdminPage
流程的扩展。
这可能吗?
这是我当前的代码:
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....
}
}
然而,这具有上述效果。
答案 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()
使用此功能,我可以使第二项测试使用其父项作为设置阶段。