【问题标题】:Executing multiple JUnit tests using the same WebDriver object使用同一个 WebDriver 对象执行多个 JUnit 测试
【发布时间】:2019-11-14 10:52:00
【问题描述】:

我目前有许多共享不同测试的 Web UI 测试(例如,AccessOwnProfiletest 和 AccessAdminMenu 测试都派生自 Logintest。)所以当我在我的套件,将为这两个测试创建一个新的 WebDriver 实例,因此 Login 测试将运行多次,因为 AccessOwnProfileAccessAdminMenu 都扩展了 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 中同时使用了AccessOwnProfileAccessAdminMenuLogin 将被执行两次,这是没有意义的。理想情况下,我希望能够只运行一次Login 测试。

这并不一定很难,我只需要在我的测试类中删除extends,这样每个测试都是真正隔离的。然而,每个测试仍然希望从前一个停止的地方开始。 所以我需要能够为我的整个TestSuite 保留相同的 WebDriver 实例。

基本上我想做的是能够在同一个浏览器实例上运行多个 JUnit 测试,这些测试从另一个停止的地方开始。基本上,在测试之后,我不会像现在那样关闭网络浏览器并为新测试打开一个新的浏览器。我只是重用已经打开的浏览器。 我不完全确定如何执行此操作以及在何处进行配置。我无法将 webdriver 实例传递给我的 TestSuite 中的测试类。

根据我之前的测试,在我看来,WebDriver 的每个新实例都与之前的会话保持相同的会话,这意味着我可以在每次测试后轻松关闭浏览器并再次打开它以进行后续测试。但是我不知道这是否是一个合理的期望。这也意味着我不能轻易地从上一个测试的结束页面中恢复,这有点问题。我能想到的唯一方法是将当前页面 URL 写入 tearDown() 上的临时文件,然后在以下测试的 setUp() 上打开该文件并访问保存的 URL。

必须有更好的方法。

编辑:澄清:

就目前而言,我已将不同的测试分成多个较小的测试,以便我可以重用代码。

想象一下EditAvatar 测试。您需要先登录并访问您的个人资料。

想象一下EditUsername 测试。你也需要这样做。

我没有重复那些本身可以作为测试的任务,而是将它们分开进行,这两个测试继承自这些测试。

我的做法是这样的:

  • AccessOwnProfile 扩展 Login;
  • EditAvatar 扩展 AccessOwnProfile;
  • EditUsername 扩展 AccessOwnProfile;

等等

这意味着在我的测试套件中,如果我运行 EditUsernameEditAvatar

  • Login 将播放两次
  • AccessOwnProfile 将播放两次

为了节省时间,我希望整个套件只使用一个浏览器实例。这样我就不必为每个需要访问用户面板的测试重新Login,因为我所要做的就是运行我的Login测试一次,然后我就登录了在我的 TestSuite 的其余部分中,我不必担心为每个测试重复该特定任务。

【问题讨论】:

  • 你需要一些奇怪但没关系的东西。你是否并行运行它们?
  • 不,它们是线性运行的。我的需求有多奇怪?有没有更好的方法来测试网站功能?
  • 那么我不知道您的问题会如何出现。你初始化你的驱动程序,然后使用它直到你完成所有测试,然后close()它。为什么您需要在同一个浏览器实例上运行多个 JUnit 测试,这些测试从另一个停止的地方开始?我猜你的项目结构存在一些架构问题。
  • 我会在OP中更清楚地解释自己
  • 尝试使用Cucumber,这样您就可以轻松构建所需步骤的测试结构。

标签: java selenium selenium-webdriver junit


【解决方案1】:

我遇到了和你一样的问题。为每个测试关闭和重新打开 WebDriver 对我来说是不行的。所以我在网上挖了一个solution by Tarun Lalwani(向下滚动到尝试 3 以获取解决方案)。

他基本上找到了一种重用 WebDriver 的方法,方法是提取其驱动程序(例如 GeckoDriver,...)URL 和 SessionID,然后可以使用这些 URL 和 SessionID 创建一个与以前相同的驱动程序通信的 RemoteWebDriver 的新实例。

此外,如果您使用的是 ChromeDriver,则上述解决方案可能不起作用,因为 Chrome 没有像上述解决方案中的 RemoteWebDriver 那样使用 W3C 编解码器 (as user2590117 stated)。因此,只需关注fix of user2590117,您就可以开始了。

为了在测试之间传递驱动程序 URL 和 SessionID,我使用 jackson 和一些自定义 JsonSerializer 对象对两者进行了序列化,这些对象工作得很好,但遗憾的是我无法分享,因为我这样做是为了工作。

【讨论】:

  • 我个人设法让我的driver 对象静态化并将我的套件中的各种测试链接在一起。如果我的“解决方案”将来给我带来任何问题,我仍然可能会转向你的答案,所以我将其标记为正确。
猜你喜欢
  • 2019-11-03
  • 2012-09-17
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多