利用jenkins分布式执行selenium自动化测试

如果jenkins部署在linux服务器上,怎么来执行本地自动化测试,怎么来提高测试效率,或者如何进行浏览器兼容测试,怎么来简化繁琐的部署,不可能每个测试机子都部署一个jenkins来启动持续集成,目前有挺多方式来解决这个问题,目前针对我们测试部我主要通过两种方式解决:
方式一:利用jenkins分布式Master-slave来解决,selenium脚本不需要修改,环境部署好,可以直接跑
方式二:利用selenium grid分布式处理,这个有介绍过点击打开链接,剩下就是把selenium grid放到jenkins里面,让jenkins去管理,这个后续一篇介绍,这种方式,driver的url要改成hud的,脚本需要稍加修改

方式一:

一、环境部署

      1)Master配置

          Master指的是服务端,也就是jenkins

         打开Jenkins的web页面,在‘系统管理’-‘管理节点’中点击‘新建节点’,输入节点名称(节点指客户端,你要用于测试的机子),选择第一个,点击ok

      

         跳到到如下图,配置完成后,点击save

      

        这时候还没连接上,图标是打叉的

    2)slave配置

       就是配置客户端node(指定的测试机)

       点击上面jenkins配置的node名称进入,如图

      

       介绍了slave nodes连接有两种方式:

       方式一:点击图中launch,下载slave-agent.jnlp,把这个文件复制到slave机器,以上master配置预设的目录E:\jenkins,记事本打开,核对ip地址,url,不要出现127.0.0.1或localhost之类的,无误后然后运行,如图

 

      之后,jenkin上node节点打叉消失,正常监控

 

       方式二:需要把slave.jar文件下载到客户端node E:\jenkins,然后把命令复制,新建个bat文件,粘贴命令,然后把bat文件也放到E:\jenkins,点击bat文件运行,Master-slave也可以连接上

       注意:配置过程中遇到个问题是,服务器在云端,走的是外网,node是本地内网,需要用外网ip,通信的端口需要打通,才可以通信,这样需要固定slave nodes连接 Master的端口,点击jenkins系统管理-configure global security 固定端口,填写开端口的端口号即可   

        还有就是Master-slave时间要同步,同时设置如图

  

二、slave node执行自动化测试

       前提,node有需要测试的浏览器

       新建新建jenkins项目,复制以前jenkins自动化项目配置,点击ok,配置中只需要修改几点就可以

   

        修改1:在General下勾上Restrict where this project can 被run,选择一个label,这个label就是创建节点时写的标签,指定运行的node,接下来源码管理不变,还是按之前配置拉取

       修改2:构建触发器,按需修改

       修改3:构建,选择构建的pom,路径要换成node节点的路径,构建后,代码会拉倒弄的机子配的工作目录下,构建设置不变

         修改4:构建后报告地址要到node机子配的工作目录读取,邮件设置不变

      

         修改5:testng报告要到node机子配的工作目录读取

     

         点击应用,完成。立即构建,等一会就可以看到node机子开始进行自动化测试了,付上jenkins部分日志,可以看到连接node,拉代码,开始测试

         最后jenkins控制台输出的日志会乱码,这时候需要在node机子添点设置,右键我的电脑→属性→高级系统设置→环境变量,添加JAVA_TOOL_OPTIONS,value为-Dfile.encoding=UTF8,注意是node机子。注意设置要正确,不然java虚拟机可能起不来。如下图

 

方法二:

一、下载selenium插件

     目前jenkins 插件下载都是selenium 3了,我的脚本用的selenium2 ,所以我这里需要selenium 2插件,那只能离线下载安装

     地址:http://updates.jenkins-ci.org/download/plugins/selenium/ 我这里下载的是2.53.0

     安装:进入:系统管理-插件管理-高级,上传,重启jenkins即可

二、配置selenium grid hub

      重启后,这样selenium grid hub 已经启动,首页会有个selenium grid菜单,如图

      

      点击进入配置信息

      

      grid web console 可以打开hub 页面,如下,console ouput就是之前服务端窗口,输出日志

      

     这里特别提下端口,我这个是云服务器,需要开端口,用的是4446,默认是4444,一开始怎么也找不到配置入口,工作目录的配置文件找遍了,也不清楚在哪里配置,后来查官方文档

 

    如上交代,再jenkins全局配置里设置,打开jenkins 系统管理-系统设置,找到selenium项,配置端口即可

   

三、配置selenium grid node

1、selenium grid简介

selenium grid可以同时在不同机器上测试不同浏览器,包含一个hub和至少一个node。node会发送配置信息到hub,hub记录并跟踪每一个node的配置信息,同时hub会接受到即将被执行的测试用例及其相关信息,并通过这些信息自动选择可用的且符合浏览器与平台搭配要求的node,node被选中后,测试用例所调用的selenium命令就会被发送到hub,hub再将这些命令发送到指定给该测试用例的node,之后由node执行测试。

2、selenium grid应用

测试多浏览器的兼容性,减少测试套件运行时间

3、selenium grid部署

这里使用selenium-server-standalone-2.48.2.jar,hub、node都需要启动selenium-server-standalone-2.48.2.jar文件启动

1)hud配置

java -jar selenium-server-standalone-2.48.2.jar -role hub -port 4446 ,默认端口为4444,如下启动成功!

输入http://xxx.xxx.xxx.xxx:4446/grid/console,如图显示

单击view config可以查看selenium grid的配置信息,默认情况单个hub支持的5个会话

也可以通过配置json文件启动

java -jar selenium-server-standalone-2.48.2.jar -role hub xxx.json

2)node配置

目前只配置一个node与hub不在同一机子

通过如下命令可启动默认设置的node,node会将本机操作系统所支持的浏览器信息全部注册到hub上,如下图

客户端cmd输入命令:java -jar selenium-server-standalone-2.48.0.jar -role node -host 27.154.242.214 -hub http://xxx.xxx.xxx.xxx:4446/grid/register

现注册一个node到hub,命令如下:

java -jar selenium-server-standalone-2.48.2.jar -role node -host 27.154.242.214 -hub http://xxx.xxx.xxx.xxx:4446/grid/register -browser browserName=firefox

seleniumProtocol=WebDriver,maxInstances=5,platform=WINDOWS 
 

如上命令只是修改了客户端ip,如果端口被占用,也可以修改客户端端口,再node后加 -port xxx ,默认是5555

注册后服务端日志如图,成功注册了一个node,此时打开http://xxx.xxx.xxx.xxx:4446/grid/console,也会显示注册的node信息,这里就不附图了

注意:客户端必须能telnet进去服务端,服务端也要能telnet进去客户端

4、执行

 

 
public static void main(String[] args) throws IOException {
 
// TODO Auto-generated method stub
 
DesiredCapabilities ff =DesiredCapabilities.firefox();
 
ff.setBrowserName("firefox");
 
ff.setPlatform("WINDOWS");
 
WebDriver driver = new RemoteWebDriver(new URL(serverUrl),ff);
 
driver.get("https://passport.csdn.net/account/login");
 
System.out.println("开始");
 
WebDriver augmentedDriver = new Augmenter().augment(driver);
 
File screenshot = ((TakesScreenshot) augmentedDriver)
 
.getScreenshotAs(OutputType.FILE);
 
FileUtils.copyFile(screenshot, new File("11.png"));
 
driver.quit();
 
 
 
}

 

运行如上实例代码,服务端日志如图,用例分给node 27.154.242.214:5555去执行

 

客户端日志,就是具体执行selenium命令的日志信息。

四、脚本修改

     启动driver,方式需要变一下,jenkins selenium grid已经给出实例,照写就可以

    

      我用的selenium2采用方式二

 
public static WebDriver getRemoteDriver(RemoteBrowser remoteBrowser) {
 
DesiredCapabilities capability = null;
 
if (remoteBrowser.getBrowserName().contains("firefox")) {
 
capability = DesiredCapabilities.firefox();
 
} else if (remoteBrowser.getBrowserName().contains("chrome")) {
 
capability = DesiredCapabilities.chrome();
 
}
 
 
 
WebDriver driver = null;
 
try {
 
driver = new RemoteWebDriver(
 
new URL(remoteBrowser.getHubURL()), capability);
 
} catch (MalformedURLException e) {
 
e.printStackTrace();
 
}
 
capability.setBrowserName(remoteBrowser.getBrowserName());
 
capability.setVersion(remoteBrowser.getVersion());
 
driver.manage().window().maximize();
 
return driver;
 
}
    
// 测试方法
 
public static void main(String[] args) throws IOException {
 
WebDriver driver = driver = RemoteBrowser.getRemoteDriver(new RemoteBrowser());
 
 
driver.get("https://passport.csdn.net/account/login");
 
System.out.println("开始");
 
WebDriver augmentedDriver = new Augmenter().augment(driver);
 
File screenshot = ((TakesScreenshot) augmentedDriver)
 
.getScreenshotAs(OutputType.FILE);
 
FileUtils.copyFile(screenshot, new File("11.png"));
 
driver.quit();
 
 
 
}

 

五、jenkins构建

      按正常自动化项目构建即可,不需要修改,构建后可以看到hub分配给匹配的node,在匹配的node机子进行自动化测试,这里就不附日志了

posted @ 2020-09-21 14:09  北极星0202  阅读(1506)  评论(0编辑  收藏  举报