java selenium testng框架搭建终极版(含源码)

文章目录

  • 介绍
  • 项目结构
  • 搭建流程
  • 注意点
  • 待优化

介绍

GitHub 源码地址:https://github.com/abcnull/webuitest4j

欢迎大家 Watch Star and Fork!

本人之前自己从头到尾尝试搭建过 selenium 测试框架,之前搭建的太粗糙了,这次重新搭建一个功能齐全的 Web UI 自动化测试框架

功能上支持 PO 模式,支持配置文件驱动,支持多线程测试,支持 Slf4j + log4j 日志系统,支持异常截图和 extentreports 测试报告等多种报告模板,支持 jenkins 做数据驱动传参构建,支持 redis 数据存储,甚至支持谷歌的 h5 测试,项目不仅支持本地系统运行浏览器,也支持运行 hub 中的浏览器节点(代码中已写 hub 启动浏览器相关代码),您只需要自己在您的服务器上配置好 hub 以及 node 节点即可使用

项目结构

- logs 日志
- src
	- main
		- java
			- com.abcnull
				- constant 项目常量
				- util 项目工具类
		- resources
			- log4j2.xml 日志模板
	- test
		- java
			- com.abcnull
				- base 测试基类
				- common 共有方法
				- data 页面数据
				- listener 测试监听器
				- locator 页面元素
				- page 页面操作方法
				- testcase 测试用例
				- util 测试工具类
		- resources
			- config 项目配置文件
			- download 下载以及需要上传文件存放处
			- driver 驱动
			- report 报告模板
- target
- .gitignore 忽略跟踪文件
- liming_test.xml 李明同学的测试文件
- pom.xml
- testng.xml 总的测试文件
- zhanghua_testng.xml 张华同学的测试文件

搭建流程

  • 1.创建 maven 项目

    idea 创建新的的 maven 项目,选择合适的项目地址,填入 groupid 和 artifactid 等信息,最后生成项目

  • 2.配置忽略跟踪的文件

    确保 idea 中安装了.ignore插件,然后项目下直接创建.gitignore文件,添加项目忽略跟踪的文件,添加内容如下

    # Directory
    .idea/
    logs/
    target/
    
    # File
    *.log
    *.iml
    
  • 3.添加项目依赖

    依赖可以自行到 maven 中央仓库中去拷贝,或者您直接查看 github 项目源码也是可行的。搭建过程中我添加了如下依赖

    lombok				1.18.4
    junit				4.12
    slf4j-api			1.7.25
    log4j-api			2.11.1
    log4j-core			2.11.1
    log4j-slf4j-impl	2.11.1
    testng				6.14.3
    selenium-java		3.141.59
    htmlunit			2.30
    extentreports		3.0.7
    commons-pool2		2.6.1
    jedis				3.0.1
    poi					4.1.0
    poi-ooxml			4.1.0
    

    其中包括基本的 lombok,单元,selenium,testng,报告,jedis,表格操作等依赖

  • 4.日志系统的配置

    这里使用 slf4j 的日志方式,桥接 log4j,也就是采用的是 log4j 日志系统

    项目/src/main/resources下添加 log4j2.xml 文件,内容部分请见此文 slf4j + log4 配置 java 的 log 日志系统

    log4j 和 slf4j 之间有什么区别和联系呢?可以看这篇文章 slf4j 和 log4j 的关系

  • 5.文件结构创建

    可以参照 项目结构 部分的结构
    java selenium testng框架搭建终极版(含源码)_第1张图片

  • 6.base 包测试基类编写

    我将 testng 中几个注解标明的有关测试生存周期的方法都放在了 BaseTest 类中,将驱动启动相关的方法放在了 BaseDriver 中,然后 BaseTest 中通过 new BaseDriver 来实例化得到其中的驱动,有人问为什么不弄成 static BaseDriver,因为我要考虑到驱动是线程隔离的,也就是说一个驱动不能在多个线程时被使用,怎么线程隔离呢?要么让这个 BaseDriver 实例化,要么将其或者其中需要的变量放在 ThreadLocal 中。还有 redis 连接池也在 BaseTest 中被初始化了。redis 的很多配置还有 驱动的很多配置并不是直接写在 BaseTest 中或者 BaseDriver 中的,而是通过将配置写进 .properties 文件,然后写一个配置文件读取的工具类来实现配置驱动项目

    BaseDriver 中主要是驱动相关,有一个启动浏览器的方法,支持有 hub 即远程也支持无 hub 即本地的方式,浏览器支持谷歌,火狐,Opera,Edge,IE,还有谷歌的 h5,目前仅谷歌支持运行 h5 脚本,至于是跑 h5 还是不跑 h5,跑哪种手机设备,还有跑哪种浏览器,和是否跑 hub 这些都可以在 testng.xml 中去配置

    驱动的策略是我希望一个线程对应一个驱动和一个 redis 连接
    java selenium testng框架搭建终极版(含源码)_第2张图片

  • 7.配置文件和配置文件读取工具类的编写

    配置文件我选择 .properties 文件,里头有驱动的配置,驱动下载路径配置,驱动隐式、显示等待时间的配置等,截图文件格式的配置,redis 连接的配置,redis 连接池配置,配置文件我存放在 test 包的资源文件 config 中

    然后我写了一个 properties 文件读取器,就是一个读配置文件的方法,另一个是取值的方法
    java selenium testng框架搭建终极版(含源码)_第3张图片

  • 8.redis 连接池工具类的编写

    redis 连接池连接 redis 服务器,这没得啥说,这个工具类在 BaseTest 中被调用,通过 redis 工具类生成连接,供测试时候存储数据

  • 9.common 公用方法

    编写一个 BrowserCommon 类,其中封装最基本的元素方法,PageCommon 中没写什么代码,主要是想到测试模块时候,各个模块可能页面比较相似,所以可以把一些比较复杂但是各个测试页面通用的代码放在这里。继承关系是测试的 PO 页面继承 PageCommon 再继承 BrowserCommon 类

  • 10.PO 思想写测试用例

    依据 PO 思想写测试用例,写了两个一个是百度页面的,另一个是博主自己博客页面的小测试用例,很简单仅仅作为一个 demo,我把 PO 页面做了下细分,由于考虑到有的页面可能元素较多,数据较多,所以我把页面的元素和数据拆出来了,当然依然满足 PO 思想,页面操作和页面元素以及页面数据

    写完并运行成功后,我们得加上错误截图和测试报告
    java selenium testng框架搭建终极版(含源码)_第4张图片

  • 11.错误截图

    写了个监听器,继承了 testng 自己提供的 TestListenerAdapter 类,其中重写了 onTestFailure 方法,来实现出错监听产出报告,方法中调用了一个自己写的截图工具类,工具类定义了截图名称是出错类名加上时间的方式,产出路径是 target 下,然后我在一个测试用例中添加了 assert false,又跑了一个测试用例,成功截图!

  • 12.产出报告

    我弄了两种报告,两种都是要写一个监听器继承了 testng 提供的 IReporter 接口,并重写其中产生报告的方法。其中一种报告我通过该方法提供的参数获取到测试的结果,把结果往一个已经放置于项目中 BeautifulReport 样式的 html 模板中添加数据,可得到产出的报告模板,另一种报告我直接使用了 extentreports 的报告模板,它的代码书写也很简单,我直接从其官网上 copy 了它的 demo,然后稍加修改就行了,您要是想用 allure2,需要您稍微改下 pom 文件,当然也是可行的
    java selenium testng框架搭建终极版(含源码)_第5张图片

  • 13.其他一些修改

    包括代码中添加 log 信息,设置了一个优先级监听器,让测试方法会在一个标签中运行完再去运行其他的,添加了一些常量信息,添加 git 跟踪文件,添加几个 testng.xml 并组织测试套件等

注意点

  1. 没有装 redis 的话也没关系,项目运行也能正常执行测试用例,虽然控制台显示 redis 连接不到,但是执行测试用例产出报告一套流程是没有丝毫影响的

  2. 项目中运行到 BeforeTest 时候会是一个新的线程,一个线程含有一个驱动和一个 redis 连接

  3. pom.xml 文件报红是正常的,并不影响 mvn test 的执行,报红是因为其中进行了外部传参,这个项目可以配置到 jenkins 中,jenkins 的 job 中创建几个参数,这些参数就可以传进 pom 文件中了,再从 pom 文件中成功传入 testng.xml 和测试用例中

  4. 建议采用谷歌浏览器,项目中谷歌驱动是 79 版本的

待优化

  1. 目前支持谷歌,火狐,欧朋,Edge,IE 浏览器,以后会考虑加上对无界面浏览器和 safari 浏览器的支持

  2. 目前对于 h5 的支持只有谷歌浏览器,往后会考虑 h5 支持火狐

  3. 往后会考虑将 redis 是否启用这一参数加进项目配置文件

  4. 往后会考虑项目中编写该项目的异常类型,目前该项目没有编写其自有的异常类

你可能感兴趣的:(Selenium)