引言
有很多同学认为在App应用大行其道的当今,再去谈论WebUI自动化测试框架是不是有点不合时宜,但是笔者认为,基于UI的自动化测试框架的设计思路和方案都是相通的,只是使用的底层工具有所不同而已,例如,WebUI一般都基于Selenium工具,AppUI一般都基于Appnium工具,UI自动化测试框架最核心的无非就是界面控件的识别与操作、测试用例的组织与运行以及测试日志和报告的生成这三个部分。下面笔者就基于Selenium2.0和Junit4这两个工具针对笔者之前所做的项目讨论一下如何扩展工具和设计框架。
控件的识别与操作
关于控件的识别和操作,首先需要关注Selenium中的以下几个类:
WebElement代表了所有的UI控件并且封装了对控件的点击操作、获取控件属性、以及查找子控件等方法
Mouse和Keyboard封装了鼠标和键盘操作
WebDriver封装了查找控件等方法
以上几个类虽然提供了查找控件以及对控件的操作封装,但是并没有按照面向对象思想来封装控件,这样会降低用例脚本编写的效率以及提高学习使用成本,比如:WebElement即可以代表一个text文本控件,又可以代表一个button按钮控件,但是很明显text和button是两个不同的界面控件元素,拥有不同的操作。
当时笔者所要应用的自动化项目,项目组的开发同学又根据公司业务特点,封装了一套控件(基于html原生元素),比如:现在流行的vue和react等控件也都封装了自己的一套控件,如果大家所要应用的自动化项目是基于以上框架开发的,那么更亟需按照面向对象思想封装一套编写自动化脚本的UI控件,下图是当时笔者所要应用自动化项目的控件,我们就可以基于这些控件来一一对应的封装编写自动化的控件。
项目控件树
自动化控件树
这样我们就可以把每个控件可用的操作封装到各自控件的内部,比如树控件JTree控件我们就可以封装如下方法:
通过Selenium提供的JavascriptExecutor可以执行JavaScript脚本并且可以返回WebElement元素的特性,把查找控件都统一封装到一个JavaScript脚本里面,这样就可以把查找与封装的具体控件分离,便于维护,方法如下:
Object executeScript(String script, Object... args); |
控件封装
上一个章节中我们说到查找控件都统一封装到一个JavaScript脚本里面,这个章节我们重点说一下怎么来封装。
1、首先我们需要在脚本里面定义一个名为Driver的类,类里面定义当前域及查找控件的代理执行方法,如下:
这样我们就可以通过执行以下js语句来执行Driver类里面的其他封装方法,如下:
2、封装具体的查找方法,我们可以封装按照id(控件ID)、text(文本)、index(索引)、type(控件类型)来查找控件,如下:
具体的封装方法还需要根据当前所应用的产品的控件形式来改变。
3、在具体调用的时候首先得确定整个页面的根节点就是body元素的id,然后根据这个id再去查找子控件。
用例的组织与运行
影响Junit执行流程的有如下几个标记:@BeforeClass、@Before、@Test、@After、@AfterClass,在每个用例执行之前或者之后都会执行有如上标记的方法,但是这些方法都需要定义在当前用例类或者父类里面,这样不便于处理每个测试用例都要执行的操作,比如每个用例执行完之后都要关闭浏览器,执行失败时都要错误截图,也不便于某一类用例需要特殊的操作。
可以通过扩展junit的runer(BlockJUnit4ClassRunner)以及可以为每个测试用例类添加监听器的方法,动态的为每个测试用例添加要执行的操作。
junit扩展流程如下:
@BeforeClass、 @Before、 @Test 、 @After 、 @AfterClass可以在基于框架的测试用例中正常使用。
框架在每一步流程中都做了扩展。
监听器如下:
具体用法如下:
测试日志和报告的生成
一般我们基于基层的工具都会有测试报告,但是如果我们想要在测试报告里面体现每个测试用例的标题、描述、优先级、执行时长以及测试日志、检查点、异常信息等个性化的需求,就需要自己封装测试报告。
首先我们需要定义用例描述(@CaseInformation)标记,与此标记相对应的监听器以及日志封装,如下:
CaseInformation标记:
ReportAndLogSetListener监听器:
日志封装:
采用开源的JavaScript树dtree生成如下的测试报告
1、整体结构
2、用例报告
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理