测试是研发体系中不可或缺的一环,全面、充分、有效的测试有利地促进了产品质量的提升。而在较短的时间内完成繁重的测试任务,需要引入自动化测试以应对测试用例繁多、测试步骤繁杂这一常见问题,并且可以减少人工成本。
针对产品开发与验收测试过程中,一方面测试效率低下,另一方面重复性高的重要用例管理问题。利用testNG+Maven框架实现了产品的Web前端页面和后端api自动化测试框架,可全面解决产品前后端测试问题,包括产品的边界测试、异常测试等。同时为性能测试和稳定性测试奠定基础。
本文介绍testNG+Maven+Selenium实现BC-PaaS产品的Web前端页面自动化测试原理和代码实现。
测试架构和流程图如下:
-1-
TestNG框架介绍
///////
TestNG是一个开源自动化测试框架,其设计灵感来自JUnit和NUnit的,引入了许多新的功能,使其功能更强大,使用更方便。
TestNG的基本注解:
-2-
Maven配置
///////
Maven本身并不是一个单元测试框架,它对项目依赖的jar包进行管理,可以让你的项目保持基本的依赖。它可以对项目进行清理、编译、测试、打包、发布等等构建项目的工作。它通过插件maven-surefire-plugin(测试运行器Test Runner)来执行JUnit/TestNG的测试用例。且这个插件能兼容JUnit3,JUnit4,TestNG。
项目结构如下:
/src/main/java/package/**
/src/test/java/package/**
UItest中有一个包含main方法的主类LauchTest.java,将main、test、全部依赖代码打包到一个jar包中,最终能通过java -jar的方式运行UItest。
Maven中pom.xml配置:
-加入Selenium的依赖来执行webdriver操作
-加入TestNG来管理测试用例
-加入ReportNG来生成测试报告
-加入Maven-Surefire-Plugin来执行TestNG的测试用例
-加入Maven Assembly Plugin来打包
-3-
Selenium
///////
Selenium目前主要用于Web端的自动化测试,但它并不仅仅局限于此。Selenuim2集成了WebDriver API,而且目前基本上主流浏览器(Chrome/Firefox/Opera/IE)都支持WebDriverAPI,并且提供了相应的WebDriver工具。
WebDriver提供了一套可以远程控制浏览器行为的协议(wire protocol),它提供了一系列的接口可以用于发现和操作我们的Web文档中的DOM元素,从而控制用户代理(浏览器)的行为。
WebDriver有几种实现,分别是HtmlUnitDrvier、FirefoxDriver、InternetExplorerDriver、ChromeDriver、OperaDriver,除了 InternetExplorerDriver只能在Windows平台运行,其他WebDriver均能跨平台。
Browser Driver一般是一个EXE(可执行)程序,或者浏览器的一个扩展程序,它使用HTTP Server持续监听Selenium2 Commands。当自动化脚本执行的时候,第一个HTTP request会创建一个新的Session,接下来对浏览器的操作将通过这个Session来执行。 创建的Session ID将用于标识后续的自动化脚本都在同一个Session中执行。
-4-
Selenium webdriver页面元素定位常用方式
///////
用Selenium实现自动化测试的过程中,需要选择页面上的元素并且对之进行各种操作,目前selenium主要页面元素定位方式主要有:
By.id()、By.name()、By.className()、By.linkText()、By.partialLinkText()、By.tagName()、 By.cssSelector()、By.xpath()
结合代码段:
页面元素定位,占整个web前端页面自动化测试工作量1/3,所以抓住一些小技巧可以事半功倍,经验总结:
- 多使用浏览器自带定位工具比如firebug和firepath
- 如果页面信息能详细包含id,name等唯一明显的标记时尽量用这些标记
- 定位时一定要找到唯一的属性要确保定位的唯一性,根据唯一的属性进行各种定位
- 当页面元素封装后,只能通过Xpath来定位,比如BC-PaaS前端页面元素的定位就是大部分情况下只能通过Xpath进行定位。
Xpath定位最不推荐的方式为:
直接打开浏览器的开发者工具,点击左上角的箭头并移到需要定位的元素,在html中直接右击>Copy>Copy XPath。
解决思路可以是:
找到该按钮的特征,例如按钮的文字是 submit;
用XPath定位,可以这样写://button[@value=‘submit’]。
-5-
利用Xpath进行页面元素定位总结
///////
在写自动化测试代码过程中,经常会遇到,想要操作的元素被封装,无法通过id,name等比较有效方式进行定位,前端代码也已经开发好,再加入id等元素也不现实,所以这时候只能用xpath方式定位,Xpath定位特征总结:
1. 用contains关键字,定位代码如下:
contains中的text()表示标签中的文本信息同时contains也支持@属性名称等如://a[contains(@id,’*****’)]等。
2. 使用元素属性定位,定位代码如下:
只要是该标签中存在的属性,理论上都可以使用(有些动态生成的属性无法使用,过长的属性也不推荐使用)例://input[@placeholder= '密码']等。
3. 使用层级定位,定位代码如下:
先定位该元素的父节点或祖先节点,再定位当前节点,中间以“//”连接。层级定位可以结合p
4. 使用兄弟节点定位,定位代码如下:
表示往下查找该元素的兄弟节点,preceding-sibling::表示往上查找该元素的兄弟节点。
关于Xpath在Selenium测试中一些缺点:
性能差,定位元素的性能比起大多数其他方法要差;
不够健壮,Xpath会随着页面元素布局的改变而改变;
兼容性不好,在不同的浏览器下对Xpath的实现是不一样的。
所以如果可能的话,尽可能使用id或者name等唯一明显的标记。
-6-
BC-PaaS前端自动化用例设计
///////
实现的测试用例,考虑到维护成本,目前主要覆盖核心的重复性高的业务场景,具体测试场景如下:
1. 登录-》创建无状态应用-》删除无状态应用
2.登录-》创建有状态应用-》删除有状态应用
3. 登录-》创建批处理应用-》删除批处理应用
4.登录-》创建系统应用-》删除系统应用
5.登录-》创建负载均衡-》删除负载均衡
6.登录-》创建路由-》删除路由
7.登录-》创建用户-》删除用户
8.登录-》创建域-》删除域
基于以上加入边界测试和异常测试用例的设计,比如页面填写边界值、创建资源超出额定资源限制等。
测试用例1.登录-》创建无状态应用代码示例:
-7-
遇到的问题总结
///////
1. 经常出现no such element
可能原因,页面没加载完成。
可以设置等待 :
直接等待
隐式等待
显式等待
2. No session
可能的原因,如前面描述selenium与webdriver通过session建立httpServer连接,当批量运行测试时,产生过多会话,机器性能原因可能导致失败。关闭窗口方法 webDriver.close() 和webDriver.quit() 。Close只是关闭当前窗口,webdriver进程仍存在;Quit是关闭当前进程,释放资源。
END
领取专属 10元无门槛券
私享最新 技术干货