我是否需要 PageObjects 设计模式?

软件测试 Python 页面对象
2022-02-03 16:54:49

现在我有一个 Selenium WebDriver 框架,看起来像这样(大大简化):

  • \app_func.py -- app_func 具有网络应用的“动作”,例如“保存新搜索”

  • \app_data.py -- app_data 有常见的断言,例如如果我重用一些测试数据,它会存储该数据的文档计数,所以我可以在我的测试文件中执行断言计数 == app_data.big_zip_file

  • \util.py -- util 具有通用的、应用程序中立的函数,例如 wait_for_text

  • \setup.cfg -- setup 包含所有服务器信息等。

然后我有一个测试目录:

  • \tests\upload_big_zip -- 每个 test.py 文件导入 app_func、app_data、util。

然后一个测试看起来像:

app_func.upload_data('big.zip')
app_func.save_a_search('search terms', app_data.big_search_hits)
app_func.verify_search_hits

因此,我得到了 PageObjects 模式的主要好处——例如,如果开发人员更改 UI,则能够轻松更新 save_a_search。但它是一个比 OO PageObjects 更“扁平”的结构。我还不能完全理解这个模式。

有什么理由我应该建立一个基于 PageObjects 的新结构吗?我正在寻找的是,与我的方法相比有什么好处?

2个回答

有时使用页面对象模式很有意义,有时也没有太大意义。如果您有一个 Web 应用程序,其中它基本上是一个单一的动态页面,那么它就不那么有意义了,但是您仍然可以使用“页面”对象,这些对象实际上更像是“部分”对象来处理常见的部分,例如,如果您有一个 Left Nav ,您可以为其创建一个页面对象,然后为日历部分或页面上任何有意义的部分创建另一个。

您从页面对象模式中获得的主要内容是

  1. 能够在一个位置识别页面上存在的元素以及适用于该页面的辅助函数,因此更改只发生在一个地方,而不是所有测试用例。
  2. 它充当 Selenium 之上的抽象层,因此如果 selenium 发生更改,您可以更新您的页面而不是每个测试用例。

您还可以在 Selenium 之上构建一个抽象层,并让您的页面对象与之交互,以进一步保护自己免受更改。

如果 AUT(被测应用程序)的元素和 AUT 的辅助函数存在于 app_func 中,并且它是一个足够简单的结构,那么您似乎遇到了页面对象模式没有那么有用的情况。由您决定它是否足够复杂,可以分成几个部分。

这取决于您的网站是如何构建的。如果您网站的页面遵循一些常见的模式,并且这些模式是有状态的,那么将页面建模为对象可能会很有用。否则,它可能不值得麻烦。