在 UI 自动化中使用页面对象而不是函数集合的权衡是什么?

软件测试 自动化测试 页面对象
2022-01-26 19:40:51

在过去的两年里,我一直在断断续续地使用 Selenium。最近我看到更多对页面对象的引用。(我指的是页面对象作为一种组织 UI 自动化代码的方法——而不是 Selenium API 中体现的接口或实现。)相对于使用单纯的函数集合,使用页面对象有哪些优点和缺点?请尝试证明优点和缺点。

4个回答

优点:

  • 代码库中测试代码和导航代码之间的清晰分离。
  • 易于理解的测试,例如 -

    Homepage.testLogin(username, password);
    

    selenium.type(username);
    selenium.type(password);
    selenium.click(submit);
    selenium.waitForpageToLoad(waitPeriod);
    
  • 易于维护,当 UI 更改时,您需要更改导航代码而不是测试(前提是应用程序逻辑仍然相同,仅更改 UI 对象/导航)

坏处:

我唯一能想到的是,页面对象的初始设计可能需要更多时间,但痛苦绝对值得

将函数放入 PageObjects 中而不是仅仅拥有一堆静态函数有三个主要优点:

  1. 语境。LoginPage.clickNext()vsItemDetails.clickNext()在查看测试时会立即告诉您当前所在的页面,即使它们是从父类继承的相同方法。
  2. 可以自动初始化 PageObject的PageObjectFactory成员变量,因此您不必在find()每次想要与某物交互时都进行操作。这使您的代码更干净,但假设您使用 PageObject 范例,并且如果您这样做会最好。
  3. 易于维护代码;如果您使用的是 Java 或 .NET,则所有内容都必须在一个类中,因此按页面将其分解为逻辑分组比将所有内容放在同一个静态类中更容易。正确命名页面类可以让您轻松找到在给定页面更改时需要更新的方法。

在实际实践中,PageObjects 主要是一种组织代码的方式,而不是任何太难或难以实现的东西。它们并没有提供太多的性能改进方式,也没有提供很多你不能做的事情,但是它们使你的代码更清晰,更容易阅读和维护。

虽然页面项目模型有很多优点,但其中一些是:

  1. 具有合理方法名称的简单明了的页面类。

  2. 您实际上可以为您的方法提供自定义名称。像上面一样,所以你不需要记住任何事情。

  3. 只需查看方法名称,您就可以全面了解该方法的功能。

  4. 使测试更具可读性。与 selenium 的上述命令相比,您需要在测试脚本中添加所有命令。在页面对象模型中,您需要放置方法名称。您根据对应用程序的理解创建的方法,因此这些方法名称更具可读性和易于理解。

  5. 保持干燥页面对象模型相信不要重复自己的原则。

  6. 良好的测试支持,因为一切都存储在一个地方。

  7. 轻松创建新测试。事实上,测试可以由不了解自动化工具特性的人创建。

因为我已经在我的项目中实际实现了它,所以肯定存在一些缺陷:

  1. 所有定位器都应保存在页面类文件中。

  2. 这种抽象导致页面类文件中的一些混乱。因此,您需要在页面对象模型之上实现诸如关键字驱动之类的东西,以充分发挥其优势。

优点:

  1. (OOP)将定义对象与在方法中实现它们分开。定义一次,多次使用。

  2. 测试的清晰度/自我记录

    loginPage.typeUsername;
    loginPage.typePassword;
    loginPage.submit;
    
  3. 易于维护 - 例如,如果登录页面元素得到更新,您只需转到 loginPage Page Object 类并更新标识元素的方法

坏处:

  1. 需要时间来构建基础设施(如前所述)
  2. 需要足够好的编程技能来设计自动化套件(+ 或 - 取决于团队的编程技能)