Page Object文献以及相关实践
Page Object专题
页面对象模型的设计优势
- 创造可以被多个测试用例共享的可重用代码。
- 减少大量重复的代码。
- 如果用户界面发生改变,则修改只用在一处进行。
图片来源:
https://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html
目的:测试代码与被测页面对象代码分离,后期如果有页面元素发生了更改,只需要修改相应页面对象的代码(即对应Class文件),而不需要修改测试的代码。
尽量使用XPath来寻找页面元素。
1 | from selenium import webdriver |
用PageObject改造后:page.py,element.py,locators.py,测试文件是test_qq.py
参照
的写法写了一下,执行时长11s.
test_qq.py
1 | 1 import unittest |
page.py
1 | 1 from element import BasePageElement |
element.py
1 | 1#元素操作 |
locators.py
1 | 1 from selenium.webdriver.common.by import By |
又经过虫师的书以及网上一些参考,进一步优化PageObject如下。
主要思想:将一个page对象封装成一个HTML页面,然后通过提供的应用程序特定的API来操作页面元素。一个API是关于应用的,一个API是关于HTML的。因此,page对象提供一个易于编程的接口并隐藏窗口中底层的部件。
- 访问一个文本框通过一个访问方法(accessor method)来实现字符串的获取和返回
- 复选框使用布尔值
- 按钮被表示为行为导向的方法名。
即page对象应当将GUI控件上所有查询和操作数据的行为封装为方法
test_qq.py
1 | #coding=utf-8 |
po_model.py
1 | #coding=utf-8 |
Page Object相关文献
2017-Search Based Path and Input Data Generation for Web Application Testing
Springer International Publishing AG 2017 T. Menzies and J. Petke (Eds.): SSBSE 2017, LNCS 10452, pp. 18–32, 2017. DOI: 10.1007/978-3-319-66299-2 2
摘要:Web应用程序的测试用例生成旨在确保完全覆盖导航结构。 现有方法采用爬行和手动/随机输入生成,有或没有导航模型的初步构造。 但是,爬网程序可能无法访问Web应用程序的某些部分,并且随机输入生成可能无法获得足够的指导来生成覆盖给定路径所需的输入。 在本文中,我们利用开发人员在编写用于Web测试的页面对象时隐式指定的导航结构,并且我们定义了一组支持联合生成测试输入和可行导航路径的新型遗传算子。 在一个案例研究中,我们的工具Subweb能够实现比基于爬行的方法更高的导航模型覆盖率,这要归功于其为可行路径生成输入和丢弃可能不可行路径的内在能力。
利用PageObject构建导航模型,每一个导航对象返回下一个导航对象,作为导航图的节点。导航方法作为导航图的边。隐式指定导航图。采用定义联合算子:在输入数据的同时生成可行的导航序列,构造导航方法人工类。
优点:
- 根据我们案例研究中收集的大小数据,编写PO和PO前置条件的手动成本似乎相对较低
- 由于其较大的尺寸,缺少过渡和分离状态/转换,爬行图形在很大程度上偏离了理想的,手动指定的PO图形。
- Subweb生产的测试套件比Ext-Crawljax生产的测试套件小11倍。 后者包括相对较大比例的不同测试案例。
- Subweb生成的测试用例实现了比Ext-Crawljax生成的更高的过渡覆盖率。
每个测试用例都是从一个空数据库开始运行的,相反,如果在每个测试用例启动时创建非空数据库,则填充数据库的路径的遍历对于两种方法变得更容易。另一方面,AddressBook是一个非常简单的应用程序,已经在以前的几个Web测试工作中使用过,没有推广到其他案例。
待研究点:
在我们未来的工作中,我们将研究从生成的测试套件开始支持自动生成断言的技术。 此外,除了AddressBook之外,我们计划在其他Web应用程序上评估Subweb。
2016-Clustering-Aided Page Object Generation for Web Testing
Andrea Stocco, Maurizio Leotta, Filippo Ricca, Paolo Tonella
Springer International Publishing Switzerland The final publication is available at Springer via http://dx.doi.org/10.1007/978-3-319-38791-8_8
摘要:为了将测试代码与网页详细信息分离,Web测试人员采用Page Object设计模式。页面对象是将网页内部(例如,表单字段)抽象为可由测试用例(例如,用户认证)调用的高级业务功能的外观类。然而,编写这样的页面对象需要相当大的努力,这在软件演进期间仅在稍后得到回报。在本文中,我们提出了一种基于聚类的方法,用于识别自动转换为Java页面对象的有意义的抽象。我们的页面对象识别聚类方法已集成到我们的自动页面对象生成工具APOGEN中。实验结果表明,聚类方法提供的网页集群接近于人工手动生成的网页(平均而言,每个网络应用程序只有三个差异)。 APOGEN生成的代码中有75%可以由Web测试人员按原样使用,从而打破了创建页面对象的手动工作。此外,自动创建以支持断言定义的大部分(84%)页面对象方法对应于有用的行为抽象。
优点:
- 有效性:应用于DOM树距离矩阵的分层聚类具有最佳性能,产生的网页集群非常接近于手动定义人类测试人员的网页集群。
- 减少:使用聚类时,生成的页面对象数量的减少范围在50-90%之间(平均67%)。
- 质量:大约75%的生成方法等同于人类测试人员定义的方法,7%需要手动重新定义,18%丢失。
相关工作:
State Objects
Van Deursen描述了页面对象的基于状态的泛化。 从测试角度来看,将页面对象移动到状态级别可以使测试场景的设计更加容易。 除了仅仅是术语上的区别,van Deursen的工作描述了一系列指导方针和良好实践(例如,让每个状态对应一个状态对象),我们共同并试图将其纳入APOGEN的发展中,因为我们的最终目标是 自动生成有意义的页面/状态对象。
Clustering
Crescenzi e tal.提出了一种聚类网页的算法,利用了DOM的结构相似性。本文研究了DOM之外的几种结构相似性度量,目的是从测试的角度支持网页的聚类。 Tonella等人。 [28]提供了两种网络聚类评估方法,黄金标准和面向任务的方法,以及实施的指南和实例。 在我们的论文中,我们将网页聚类的结果与黄金标准进行了比较,以确保其从网络测试的角度来看具有意义。在另一项工作中,Riccaetal。[20]利用基于关键词的聚类来提高对网络的理解。 在我们的论文中,我们并不局限于基于内容的指标。 实际上,结构特性(例如,DOM或TF)显示出更有效。
Crawling/DIfferencing
提出一种基于差异测试的动态技术,可自动检测跨浏览器问题(XBI)并协助开发人员进行诊断。 该方法在单个网页上运行,并侧重于可视化分析,而我们执行集群内DOM差异。 Mesbah等。 [16]使用动态爬行分析整个Web应用程序,也用于检索XBI。 同样,我们采用抓取和网页差异,但我们的方法仅限于发现群集内网页之间的文本差异,在此基础上,测试人员可以构建有意义的断言。 Choudhary等人。 [3]结合并扩展了上述两种方法,用于xBI检测工具CTOSSCHECK。
Choudhary et al. 尽管本文与我们分享了一些方法,例如使用爬虫进行Web应用程序模型的逆向工程,并在网页之间执行DOM差异,但我们使用聚类,这是一种无监督的机器学习技术,而不是分类器, 我们针对一个完全不同的目标,自动化页面对象构建。
待研究点:
我们计划改进用于创建getter方法的启发式方法,这些方法不能应用于单页集群。我们将研究一种用于输入数据生成的补充方法,能够在每个集群中公开多个页面和单个页面的可变部分。我们还将研究基于图像处理的视觉机制,以检索动态页面部分[3]并生成可视页面对象[11]。最后,我们计划通过使用强大的Web元素本地化技术增强APOGEN来提高页面对象的可维护性[12-14]。
2016-APOGEN: automatic page object generator for web testing
Andrea Stocco1 • Maurizio Leotta1 • Filippo Ricca1 • Paolo Tonella2
摘要:事实证明,页面对象模式的使用在端到端Web测试中非常有效.Pageobjects是一种将网页内部抽象为可由测试用例调用的高级业务功能的装置。通过将测试代码与网页细节分离,Web测试用例更具可读性和可维护性。然而,这种页面对象的手动开发需要大量的编码工作,这在稍后的软件演进期间才能得到回报。在本文中,我们描述了一种自动生成Web应用程序页面对象的新方法。我们的方法在APOGEN工具中实现,APOGEN通过对目标Web应用程序进行逆向工程自动派生测试模型。它结合了聚类和静态分析,可以识别有意义的页面抽象,这些抽象会自动转换为Selenium WebDriver的Java页面对象。我们对开源Web应用程序的评估表明,我们的方法非常有前途:自动生成的页面对象方法涵盖了大多数应用程序功能,并产生可读且有意义的代码,这对于支持创建更易维护的Web测试非常有用。
优点:页面对象用于端到端功能Web测试,以将测试用例逻辑与技术低级实现分离。虽然页面对象带来了无可否认的优势,但随着自动化测试套件的维护工作量的减少,手动开发的负担限制了它们的广泛采用。我们为我们的工具APOGEN提供了一种自动生成Web应用程序页面对象的新方法,
该工具使用逆向工程,机器学习,Web可视化,HTML静态分析和自动生成Web应用程序的Java页面对象。差分和AST创建。在本文中,我们对我们的工具进行了详细描述,并通过案例研究应用程序PETCLINIC对其进行了说明。结果很有希望,并表明我们的自动页面对象生成方法是可行的。实际上,APOGEN能够生成有意义且全面的Java页面对象,涵盖大多数PETCLINIC功能。我们还展示了自动页面对象减少了测试用例开发的测试人员工作量,因为测试代码的大部分是自动生成的,并且提高了测试代码的质量(即可理解性和可维护性),因为它们将它们解耦具体实施的逻辑。
Web应用程序的端到端功能测试是一种基于测试场景概念的黑盒测试,是在AUT上执行的一系列步骤/操作。 通过指定每个步骤中使用的实际输入数据以及预期结果,可以从测试场景中派生出一个或多个测试用例。在自动化Web测试中,Web测试人员通过编写由命令组成的测试代码来实现方案,这些命令提供输入数据并设置GUI组件的值,并通过断言来确定程序是否正常运行。不幸的是,由此产生的测试代码通常难以维护和发展。 其中一个主要问题是测试用例之间的代码重复。 当必须在多个测试用例(例如,用户登录)中调用相同的功能时,主要缺点是在不同的测试用例中存在相同的代码片段。 通常,这样的代码片段仅指定实现细节(例如,username.sendKeys(’’admin’’)),这些细节是重复的,而不是跨测试用例共享和重用。 实际上,在执行任何测试活动时,区分测试规范和测试实现很重要,保持测试逻辑与实现细节分离。
2015-Incremental Web ApplicationTesting using PageObject
2015 Third IEEE Workshop on Hot Topics in Web Systems and Technologies
Bing Yu
摘要:软件测试对于确保软件质量是必不可少的。传统的软件测试技术由于其独特的特性,例如高度动态的网页生成和与DOM元素的交互,对现代Web应用程序来说是不够的。同时,现有的Web测试技术在长期维护和演进中使用起来很麻烦,因为在网页快速变化的情况下测试通常很脆弱。在本文中,我们提出了一种动态Web应用程序的自动测试生成技术。我们的技术通过自动生成页面对象有效地将测试代码与网页分离。基于页面对象,我们的技术执行迭代反馈定向随机测试生成。我们对七个真实网络应用程序的评估表明,所提出的技术实现了合理的代码覆盖率(从23.3%到90.8%),并且可以有效地探索动态生成的网页(比原始静态网页大约多14.7倍),揭示了数百个HTML问题和五个应用程序中的真正错误。
优点:我们采用反馈定向随机测试来生成测试用例并逐步探索更多状态。 我们展示了基于页面对象的方法使传统的测试技术能够应对测试基于AJAX的Web应用程序的挑战。 我们在七个真实的Web应用程序中展示了我们的方法的有效性。 据我们所知,我们是第一个基于页面对象自动生成Web应用程序测试用例的人。 我们未来的工作包括:(1)通过删除不相关的方法序列组合来提高测试生成性能,以及(2)研究页面对象抽象范围对测试有效性的影响。
2015-Why Creating Web Page Objects Manually If It Can Be Done Automatically?
2015 IEEE/ACM 10th International Workshop on Automation of Software Test
Andrea Stocco1, Maurizio Leotta1, Filippo Ricca1, Paolo Tonella2
摘要:-Page Object是一种旨在使Web测试脚本更具可读性,健壮性和可维护性的设计模式。 手动创建Web应用程序所需的页面对象的工作量可能很大,不幸的是现有工具无法帮助Web开发人员完成此类任务。 在本文中,我们介绍了APOGEN,一种自动生成网页应用程序的工具。通过对目标Web应用程序进行逆向工程,自动生成测试模型,并结合使用动态和静态分析为流行的Selenium WebDriver框架生成Java页面对象。 我们的初步评估表明,可以使用大约3/4的自动页面对象方法,而剩下的1/4只需要很小的修改。
缺点:
- APOGEN依赖于CRAWLJAX的性能,当CRAWLJAX在探索应用程序的状态空间时失败时,不会为爬虫无法访问的那些页面创建页面对象。
- 构建测试模型的静态分析。虽然动态和静态分析的结合已经证明在我们的案例研究中是有效的,但是如果应用程序的DOM具有具有难以理解的名称的属性或者具有可以构建页面对象元素的属性太少而可能不那么有效。
待研究点:
- 研究更多应用程序的工具性能来分析这个问题。为测试人员提供在触发代码生成之前与工具交互的可能性,以便干预APOGEN无法检索有意义名称的所有情况。
- 调查前面提到的页面对象合并策略,看看它是否可以提高页面对象的可理解性。
- 打算使用一组getter方法来扩充页面对象,这些方法通过页面中的动态信息标识从Web应用程序检索有意义的文本信息。这样可以提高页面对象的完整性,并且可以为测试用例的写入提供支持。
- 在动态分析中识别交互模式来解决仍然需要手动修改的方法的局限性,以便我们能够自动添加缺失的参数和语句。
广度优先遍历图
1 | proc breadthFirstVisit(n : Node,p : Path) ≡ do |
广度优先测试序列生成策略的伪代码(BFV:广度优先访问)。使用全局队列数据结构(Q)来存储部分探索的路径,以便稍后在访问期间考虑。所有未探测的后继节点(下一组)连接到当前遍历路径p并添加到Q以供将来探索。如果不存在未探测的后继节点,则访问终止,并将遍历的路径p添加到测试套件中。如果队列Q不为空,则需要通过对breadthFirstVisit的递归调用遍历一些挂起路径。这个程序涉及一定程度的非确定性,与要探索的路径被添加到Q的顺序有关。实际上,不同的命令将会在不同的时间改变转换的访问状态,可能导致不同的测试序列被添加到最终的测试套件中。当p + se被添加到Q时,通过从下一个集合中随机选择节点se来解决这个问题。过渡覆盖由BFV通过构造授予。与转换覆盖范围不同的充分性标准(例如,最大测试预算)可能需要多次调用过程breadthFirstVisit。