【发布时间】:2019-11-14 10:52:00
【问题描述】:
我目前有许多共享不同测试的 Web UI 测试(例如,AccessOwnProfiletest 和 AccessAdminMenu 测试都派生自 Logintest。)所以当我在我的套件,将为这两个测试创建一个新的 WebDriver 实例,因此 Login 测试将运行多次,因为 AccessOwnProfile 和 AccessAdminMenu 都扩展了 Login 测试,如下所示:
public class AccessOwnProfile extends Login {
@Before
public void setUp() throws Exception {
super.setUp();
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
public void test() throws Exception {
super.test();
...
}
这不好,因为如果我的TestSuite 中同时使用了AccessOwnProfile 和AccessAdminMenu,Login 将被执行两次,这是没有意义的。理想情况下,我希望能够只运行一次Login 测试。
这并不一定很难,我只需要在我的测试类中删除extends,这样每个测试都是真正隔离的。然而,每个测试仍然希望从前一个停止的地方开始。
所以我需要能够为我的整个TestSuite 保留相同的 WebDriver 实例。
基本上我想做的是能够在同一个浏览器实例上运行多个 JUnit 测试,这些测试从另一个停止的地方开始。基本上,在测试之后,我不会像现在那样关闭网络浏览器并为新测试打开一个新的浏览器。我只是重用已经打开的浏览器。
我不完全确定如何执行此操作以及在何处进行配置。我无法将 webdriver 实例传递给我的 TestSuite 中的测试类。
根据我之前的测试,在我看来,WebDriver 的每个新实例都与之前的会话保持相同的会话,这意味着我可以在每次测试后轻松关闭浏览器并再次打开它以进行后续测试。但是我不知道这是否是一个合理的期望。这也意味着我不能轻易地从上一个测试的结束页面中恢复,这有点问题。我能想到的唯一方法是将当前页面 URL 写入 tearDown() 上的临时文件,然后在以下测试的 setUp() 上打开该文件并访问保存的 URL。
必须有更好的方法。
编辑:澄清:
就目前而言,我已将不同的测试分成多个较小的测试,以便我可以重用代码。
想象一下EditAvatar 测试。您需要先登录并访问您的个人资料。
想象一下EditUsername 测试。你也需要这样做。
我没有重复那些本身可以作为测试的任务,而是将它们分开进行,这两个测试继承自这些测试。
我的做法是这样的:
-
AccessOwnProfile扩展Login; -
EditAvatar扩展AccessOwnProfile; -
EditUsername扩展AccessOwnProfile;
等等
这意味着在我的测试套件中,如果我运行 EditUsername 和 EditAvatar:
-
Login将播放两次 -
AccessOwnProfile将播放两次
为了节省时间,我希望整个套件只使用一个浏览器实例。这样我就不必为每个需要访问用户面板的测试重新Login,因为我所要做的就是运行我的Login测试一次,然后我就登录了在我的 TestSuite 的其余部分中,我不必担心为每个测试重复该特定任务。
【问题讨论】:
-
你需要一些奇怪但没关系的东西。你是否并行运行它们?
-
不,它们是线性运行的。我的需求有多奇怪?有没有更好的方法来测试网站功能?
-
那么我不知道您的问题会如何出现。你初始化你的驱动程序,然后使用它直到你完成所有测试,然后
close()它。为什么您需要在同一个浏览器实例上运行多个 JUnit 测试,这些测试从另一个停止的地方开始?我猜你的项目结构存在一些架构问题。 -
我会在OP中更清楚地解释自己
-
尝试使用
Cucumber,这样您就可以轻松构建所需步骤的测试结构。
标签: java selenium selenium-webdriver junit