无论自动化或手工测试其主要目的都是为了持续提高产品的质量,无论企业的项目采取哪种软件开发模型, 自动化测试早已成为当下测试过程中不可或缺的一部分,增加自动化测试覆盖率也已被企业视为衡量测试团队效率的关键绩效指标(KPI)之一。
今天我们就来聊一聊Web自动化测试中的页面对象模型(POM),开启你对它的认知,探访POM是如何通过减少代码重复来有效减轻自动化维护的工作。
1. 页面对象模型(POM)攻略
页面对象模型是一种设计模式,其核心重点是通过减少代码重复,进而达到最小化代码更新/维护中涉及的工作量。 基于页面对象模型(POM)的实现包含以下关键要素:
(1) 页面类(Page Class/Page Object):
—— 包含被测页面中页面元素(WebElements)对象的存储库;
—— 包含针对这些页面元素(WebElements)执行操作的实现;
(2) 测试用例(Test Cases):
—— 包含实际测试场景,测试步骤的实现;
—— 通过页面类(Page Class)中的方法与页面元素(WebElements)进行交互;
—— 当页面元素(WebElements)发生更改,仅需要更新页面类(Page Class),测试代码保持不变;
2. 线性脚本测试用例Demo
我们以“当当网”高级搜索为例,通过Selenium Python + unittest进行线性脚本测试用例展示。
【测试场景】
(1)通过Chrome浏览器,打开“当当网”高级搜索页面
(2)定位到“数字商品”Tab
(3)输入相关查询词条
(4)执行搜索
(5)关闭浏览器
【测试脚本实现】
(1)相关库的导入
(2)创建测试用例
到此,该场景的自动化测试脚本编写完成。显而易见,这属于中规中矩的自动化测试脚本,其中setUp和tearDown分别用于做浏览器驱动的初始化和关闭,test_DangDangSearch用来执行搜索查询相关的测试步骤。
3. 页面对象模型(POM)实现Demo
通过观察后不难发现,当被测页面上任意一个元素发生变更时,我们需要对整个测试用例进行更新,如果这样的测试用例有几十个,甚至于几百个呢,难不成一个个脚本更新吗?这样做未免效率太低了,自动化测试的优势将直接变成了劣势。
所幸的是,页面对象模型(POM)设计给我们带来了解决方案。下面我们将通过引入页面对象模型(POM),对上述线性自动化测试脚本进行优化。
【测试场景】
同上。
【分析与设计】
(1)为了将上面的线性测试脚本移植到Selenium Python的页面对象模型中,我们将约定遵循一个目录结构,后续无论项目规模和复杂程度如何,都可以将该目录结构视作模板进行扩展;
(2)目录结构的选择取决于测试需求,测试复杂性以及整个研发测试团队的经验;
(3)根据以上条件,我们可以得出如下目录结构:
根据约定的目录结构,在Pycharm中我们新建如下项目:
【应用PO模式的脚本实现】
(1)元素定位器
如上图结构所示,目录Project-Directory \ PageObject包含Locators.py,其中根据需要添加了元素定位方式,具体代码实现如下:
·Src-----PageObject-----Locators.py
由于元素定位方式是根据被测页面添加的,因此后续如有任何关于元素定位方式的变更只需要在Locators.py文件中做相应的更改即可,其他项目文件不会受到影响。
(2)被测页面Page
该文件用到了Locators.py中定位的元素,并实现了Locators.py中相关元素的操作,具体代码实现如下:
·Src-----PageObject-----Pages-----SearchPage.py
(3)Web驱动初始化
为了提高代码的可管理性和可移植性,我们将Selenium Webdriver初始化设置与测试套件和测试用例分开存放;
如果后续计划使用其他Web驱动程序执行测试时,仅需要在WebDriverSetup.py文件中进行更改即可,其余项目文件的实现保持不变。
下面是Selenium Webdriver的setUp和tearDown方法在WebDriverSetup.py文件中的统一实现。
·Src-----TestBase-----WebDriverSetup.py
使用页面对象模型(POM)最终目的是为了最大程度地减少重复代码的百分比,并使代码更具可移植性。
我们通常会将实现划分为以下3部分:
·定位符Locators,页面Pages(基于被测网页)
·测试脚本(即测试用例,基于被测网页)
·测试套件(测试用例的汇总)
(4)测试用例
目前我们已经准备好了WebDriver设置和所需被测页面的实现,接下来就是测试用例的脚本编写了。
下面是“当当网”高级搜索查询功能的测试用例脚本实现,该脚本使用了目前为止已完成的测试基础结构(“定位器Locator+页面Page”)。
·Test ----- Scripts ----- test_Home_Page.py
·Test ----- Scripts ----- test_DangDang_Search.py
由上述测试用例可见, 我们首先创建了Search类的实例,以便于在后续部分中使用该实例的属性及方法,以下方法是在当当高级搜索页面种进行的操作:
·tab.click()
·bookname.send_keys()
·ISBN.send_keys()
·author.send_keys()
·publisher.send_keys()
·submit.click()
(5)测试用例套件触发器
用例套件触发器用于加载测试用例到测试套件后,再批量启动执行。具体代码实现如下:
·Test ----- TestSuite -----TestRunner.py
4. 总结
页面对象模型(Page Object Model)使测试代码更易于维护,并最大程度地减少项目/产品中的代码重复率。因此,无论Web应用程序亦或是网页中UI是否频繁更改,测试与开发团队都应积极探索并有效将其应用于Selenium自动化测试中。
以上基于页面对象模型(POM)进行了详细介绍,由浅入深展示了线性自动化测试脚本经过POM改进优化的整个过程,希望能够给大家的测试工作带来帮助,感兴趣的读者不妨一试。
作者:罗狮小钉