测试框架——luckyframeclient之Jenkins部署

背景

client端执行webUI自动化测试时依赖操作系统上安装了对应的浏览器,并且浏览器与驱动要进行版本的对应——而selenium是可以部署集群,通过远程的方式执行对应的自动化用例,方便高效。

原理

1、通过代码可知,自动化运行的主类接收了任务id,获取到任务信息后根据任务类型判断进行接口测试  或  UI测试

public class RunAutomationTest extends TestControl {
    public static void main(String[] args) {
        try {
            PropertyConfigurator.configure(RunService.APPLICATION_HOME + File.separator + "log4j.conf");
            String taskid = args[0];
            TaskExecute task = GetServerApi.cgetTaskbyid(Integer.parseInt(taskid));
            TaskScheduling taskScheduling = GetServerApi.cGetTaskSchedulingByTaskId(Integer.parseInt(taskid));
            if (taskScheduling.getTaskType() == 0) {
                // 接口测试
                TestControl.taskExecutionPlan(task);
            } else if (taskScheduling.getTaskType() == 1) {
                // UI测试
                WebTestControl.taskExecutionPlan(task);
            } else if (taskScheduling.getTaskType() == 2) {
                AppTestControl.taskExecutionPlan(task);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            LogUtil.APP.error("启动测试任务运行主函数出现异常,请检查!",e);
        } finally{
            System.exit(0);
        }
    }
}

2、通过wd = WebDriverInitialization.setWebDriverForTask(drivertype)  这行代码可知,根据浏览器的类型获取了驱动。UI自动化浏览器类型 0 IE 1 火狐 2 谷歌 3 Edge 4 集群,其中4 集群是我自己添加的,用来标识远程集群。

    public static void taskExecutionPlan(TaskExecute task) {
        // 记录日志到数据库
        serverOperation.exetype = 0;
        String taskid = task.getTaskId().toString();
        TestControl.TASKID = taskid;
        String restartstatus = RestartServerInitialization.restartServerRun(taskid);
        BuildResult buildResult = BuildingInitialization.buildingRun(taskid);
        List<ProjectCaseParams> pcplist = GetServerApi.cgetParamsByProjectid(task.getProjectId().toString());
        TaskScheduling taskScheduling = GetServerApi.cGetTaskSchedulingByTaskId(task.getTaskId());
        String projectname = taskScheduling.getProject().getProjectName();
        task = GetServerApi.cgetTaskbyid(Integer.parseInt(taskid));
        String jobname = taskScheduling.getSchedulingName();
        int drivertype = serverOperation.querydrivertype(taskid);
        int[] tastcount;
        // 判断是否要自动重启TOMCAT
        if (restartstatus.contains("Status:true")) {
            // 判断是否构建是否成功
            if (BuildResult.SUCCESS.equals(buildResult)) {
                WebDriver wd = null;
                try {
                    wd = WebDriverInitialization.setWebDriverForTask(drivertype);
                } catch (WebDriverException e1) {
                    LogUtil.APP.error("初始化WebDriver出错 WebDriverException!", e1);
                } catch (IOException e2) {
                    LogUtil.APP.error("初始化WebDriver出错 IOException!", e2);
                }
                serverOperation caselog = new serverOperation();

                List<ProjectCase> cases = GetServerApi.getCasesbyplanId(taskScheduling.getPlanId());
                LogUtil.APP.info("当前测试任务 {} 中共有【{}】条待测试用例...",task.getTaskName(),cases.size());
                serverOperation.updateTaskExecuteStatusIng(taskid, cases.size());
                int i = 0;
                for (ProjectCase testcase : cases) {
                    i++;
                    LogUtil.APP.info("开始执行当前测试任务 {} 的第【{}】条测试用例:【{}】......",task.getTaskName(),i,testcase.getCaseSign());
                    List<ProjectCaseSteps> steps = GetServerApi.getStepsbycaseid(testcase.getCaseId());
                    if (steps.size() == 0) {
                        continue;
                    }
                    try {
                        // 插入开始执行的用例
                        caselog.insertTaskCaseExecute(taskid, taskScheduling.getProjectId(),testcase.getCaseId(),testcase.getCaseSign(), testcase.getCaseName(), 4);
                        WebCaseExecution.caseExcution(testcase, steps, taskid, wd, caselog, pcplist);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        LogUtil.APP.error("用户执行过程中抛出异常!", e);
                    }
                    LogUtil.APP.info("当前用例:【{}】执行完成......进入下一条",testcase.getCaseSign());
                }
                tastcount = serverOperation.updateTaskExecuteData(taskid, cases.size(),2);

                String testtime = serverOperation.getTestTime(taskid);
                LogUtil.APP.info("当前项目【{}】测试计划中的用例已经全部执行完成...",projectname);
                MailSendInitialization.sendMailInitialization(HtmlMail.htmlSubjectFormat(jobname),
                        HtmlMail.htmlContentFormat(tastcount, taskid, buildResult.toString(), restartstatus, testtime, jobname),
                        taskid, taskScheduling, tastcount,testtime,buildResult.toString(),restartstatus);
                // 关闭浏览器
                assert wd != null;
                wd.quit();
            } else {
                LogUtil.APP.warn("项目构建失败,自动化测试自动退出!请前往JENKINS中检查项目构建情况。");
                MailSendInitialization.sendMailInitialization(jobname, "构建项目过程中失败,自动化测试自动退出!请前去JENKINS查看构建情况!", taskid,
                        taskScheduling, null,"0小时0分0秒",buildResult.toString(),restartstatus);
            }
        } else {
            LogUtil.APP.warn("项目TOMCAT重启失败,自动化测试自动退出!请检查项目TOMCAT运行情况。");
            MailSendInitialization.sendMailInitialization(jobname, "项目TOMCAT重启失败,自动化测试自动退出!请检查项目TOMCAT运行情况!", taskid,
                    taskScheduling, null,"0小时0分0秒",buildResult.toString(),restartstatus);
        }
    }

 3、在类WebDriverInitialization的setWebDriverForTask方法中添加针对浏览器集群的驱动,代码如下,添加了else if通过配置生成浏览器驱动。

 1     public static WebDriver setWebDriverForTask(int drivertype) throws WebDriverException,IOException{
 2         // 参数为空
 3         String drivenpath= RunService.APPLICATION_HOME + File.separator+"BrowserDriven"+File.separator;
 4         WebDriver webDriver = null;
 5         LogUtil.APP.info("准备初始化WebDriver对象...检查到当前操作系统是:{}",OS);
 6         if(drivertype==0){
 7             if(OS.startsWith("win")){
 8                 System.setProperty("webdriver.ie.driver",drivenpath+"IEDriverServer.exe");
 9                 webDriver = new InternetExplorerDriver();
10             }else{
11                 LogUtil.APP.warn("当前操作系统无法进行IE浏览器的Web UI测试,请选择火狐或是谷歌浏览器!");
12             }        
13         }else if(drivertype==1){
14             FirefoxOptions options = new FirefoxOptions();
15             if(OS.startsWith("win")){
16                 System.setProperty("webdriver.gecko.driver",drivenpath+"geckodriver.exe");
17             }else if(OS.contains("mac")){
18                 options.addArguments("start-maximized");
19                 System.setProperty("webdriver.gecko.driver",drivenpath+"geckodriver_mac");
20             }else{
21                 LogUtil.APP.info("检测到当前系统环境是Linux,默认使用headless方式运行Firefox浏览器的Web UI自动化...");
22                 //无界面参数
23                 options.setHeadless(true);
24                 //禁用沙盒
25                 options.addArguments("no-sandbox");
26                 options.addArguments("start-maximized");
27                 System.setProperty("webdriver.gecko.driver",drivenpath+"geckodriver_linux64");
28             }
29             webDriver = new FirefoxDriver(options);
30         }else if(drivertype==2){
31             ChromeOptions options = new ChromeOptions();
32             if(OS.startsWith("win")){
33                 System.setProperty("webdriver.chrome.driver",drivenpath+"chromedriver.exe");
34             }else if(OS.contains("mac")){
35                 options.addArguments("start-maximized");
36                 System.setProperty("webdriver.chrome.driver",drivenpath+"chromedriver_mac");
37             }else{
38                 LogUtil.APP.info("检测到当前系统环境是Linux,默认使用headless方式运行Chrome浏览器的Web UI自动化...");
39                 //无界面参数
40                 options.setHeadless(true);
41                 //禁用沙盒
42                 options.addArguments("no-sandbox");
43                 options.addArguments("start-maximized");
44                 System.setProperty("webdriver.chrome.driver",drivenpath+"chromedriver_linux64");
45             }            
46             webDriver = new ChromeDriver(options);
47         }else if(drivertype==3){
48             if(OS.startsWith("win")){
49                 System.setProperty("webdriver.edge.driver",drivenpath+"msedgedriver.exe");
50                 webDriver = new EdgeDriver();
51             }else if(OS.contains("mac")){
52                 System.setProperty("webdriver.edge.driver",drivenpath+"msedgedriver_mac");
53                 webDriver = new EdgeDriver();
54             }else{
55                 LogUtil.APP.warn("当前操作系统无法进行Edge浏览器的Web UI测试,请选择火狐或是谷歌浏览器!");
56             }
57         }else if(drivertype==4){
58             // 返回配置好的remote
59             Properties properties = SysConfig.getConfiguration();
60             String hubUrl = properties.getProperty("remote.webdriver.url");
61             String browser = properties.getProperty("remote.webdriver.browser");
62             LogUtil.APP.info("集群执行webUI:{},节点浏览器类型为:{}....",hubUrl,browser);
63             switch (browser){
64                 case "chrome":
65                     webDriver = new RemoteWebDriver(new URL(hubUrl), DesiredCapabilities.chrome());break;
66                 case "firefox":
67                     webDriver = new RemoteWebDriver(new URL(hubUrl), DesiredCapabilities.firefox());break;
68                 case "safari":
69                     webDriver = new RemoteWebDriver(new URL(hubUrl), DesiredCapabilities.safari());break;
70                 case "edge":
71                     webDriver = new RemoteWebDriver(new URL(hubUrl), DesiredCapabilities.edge());break;
72                 default:
73                     LogUtil.APP.warn("集群中浏览器配置错误,默认使用chrome浏览器...",browser);
74                     webDriver = new RemoteWebDriver(new URL(properties.getProperty("remote.webdriver.url")), DesiredCapabilities.chrome());break;
75             }
76         }else{
77             LogUtil.APP.warn("浏览器类型标识:{},获取到的浏览器类型标识未定义,默认IE浏览器进行执行....",drivertype);
78             System.setProperty("webdriver.ie.driver",drivenpath+"IEDriverServer.exe");
79             webDriver = new InternetExplorerDriver();
80         }
81         
82         //解决webdriver在unix环境中,最大化会出现异常的bug,unix最大化在options中单独设置
83         if(OS.startsWith("win")){
84             assert webDriver != null;
85             webDriver.manage().window().maximize();
86         }
87 
88         //设置页面加载最大时长30秒
89         assert webDriver != null;
90         webDriver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
91         //设置元素出现最大时长30秒  
92         webDriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
93         
94         return webDriver;
95     }
View Code

操作

1、docker搭建selenium集群——不要问为啥用docker,问就是因为docker简单稳定;若想远程调试可以安装debug版本,使用VNC调试。

# 创建docker网络
docker network create grid
# 以docker容器的形式启动hub并暴露4444端口
docker run -d -p 4444:4444 --net grid --name selenium-hub selenium/hub:3.14.0-europium
# 以docker容器的形式启动并挂载Chrome的Node
docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-chrome:3.14.0-europium
# 以docker容器的形式启动并挂载Firefox的Node
docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-firefox:3.14.0-europium

2、Jenkins部署客户端(都是构建maven项目,参考web端部署)

创建maven项目流水线>源码管理填写client端git仓库及分支>前置脚本干掉进程>构建设置(同web端)>后置脚本启动程序

后置脚本如下

cp -r /home/jiayifei.1995/.jenkins/workspace/LuckyFrameClient/target/* /home/jiayifei.1995/deploy/LuckyFrameClient
BUILD_ID=donKillMe
cd /home/jiayifei.1995/deploy/LuckyFrameClient/classes/
sh start_service.sh

 

原文地址:https://www.cnblogs.com/ftxy/p/14465763.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


基础环境、流程图1)流程图jenkinspipeline发布应用2)、jenkins上安装kubectl#主节点上查看kubectl位置[root@k8s01~]#whichkubectl/usr/bin/kubectl#将k8s节点的kubectl文件cp至jenkinsscp10.0.0.101:/usr/bin/kubectl.cp./kubectl/usr/local/bin/kubectl
本节是建立在流水线入门内容的基础上,而且,应当被当作一个参考。对于在实际示例中如何使用流水线语法的更多信息,请参阅本章在流水线插件的2.5版本中的使用Jenkinsfile部分,流水线支持两种离散的语法,具体如下对于每种的优缺点,参见语法比较。正如本章开始讨论的,流水线最
Linuxcentos7安装Jenkins(jenkins-2.227-1.1.noarch.rpm)时遇到问题:1.出现问题1:安装jenkins一直失败,提示Nosuchfileordirectory[helen@linuxprobeJenkins]$sudorpm-ivhjenkins-2.227-1.1.noarch.rpmPreparing...####################
作为一个拥有很多账号的当代美少女,忘记用户名密码什么的是再正常不过的事了。“忘记密码”这一功能给我真的带来了很大的福音啊。但是最近重新使用Jenkins时,看到需要输入用户名密码,顿时脑子一片空白。经过一系列的查找,终于解决了问题,害,只有把方法记下来才是王道,以后妈妈再
Jenkins、GitLab和Maven(Nexus)完成自动构建迈向持续集成持续集成,毋庸置疑的是这是两部分要求,一个是持续一个是集成,那么持续和集成到底表示了什么要求和含义呢?其中的集成比较容易理解就是指开发人员将自己开发的代码不断地交付给全部系统的代码,在Git仓的概念之下也就是不断地
 下载文档https://www.jenkins.io/zh/download/  Debian下载1.下载安装keyhttps://pkg.jenkins.io/debian-stable/jenkins.io.key  
流水线建设从Jenkins部署开始Jenkins是一个独立的开源自动化服务器,可以用来自动化,例如构建、测试和部署软件等各种任务,是一个实现CI(持续集成)的很好的工具。Jenkins可以通过本地系统包、Docker安装,甚至可以在安装Java运行时环境的机器上独立运行。JenkCI/CD的概念谈到持
原因:这种情况是SSHServer中的RemoteDirectory路径不存在。解决方法:重新输入目标服务器中存在的路径。      
什么是持续集成持续集成(Continuousintegration,简称CI)指的是,频繁地(一天多次)将代码集成到主干。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。通过持续集成,团
Tomcat安装:1.下载Tomcat包:http:/omcat.apache.org/并解压2.启动:双击bin\startup.bat文件浏览器访问:http://localhost:8080/3.Tomcat配置登录:打开confomcat-users.xml文件添加如下代码:<rolerolename="manager-gui"/><userusername="admin"password=&q
文章目录jenkinscron笔记简介H符号(hash的简写)别名例子jenkinscron笔记简介jenkinscron遵循普通cron的语法,略有不同,每行包含五个字段可以使用Tab和空行分割分钟小时日月周0-590-231-311-120-7(0和7都表示周日)可以使用以下操作符为一个字段指定多个值(按照
1.nginx的配置location/jenkinsno{indexindex.htmlindex.htm;proxy_passhttp://127.0.0.1:8081;proxy_connect_timeout3000s;proxy_send_timeout3000s;proxy_read_timeout3000s;prox
1、下载安装插件下载地址:http://files.jetbrains.org.cn/aliyun-oss.hpi在Jenkins中安装插件,请到ManageJenkins->Advanced->Upload,上传插件(.hpi文件)安装完毕后请重新启动Jenkins2、搜索安装jenkins插件安装3、安装完成以后配置阿里云oss账号oss这边设置:(账号的权限也要
首先将构建历史清除Jenkins构建历史删除与重置然后进入Jenkins服务器工作目录oot/.jenkinstar-czvfjobs.tarjobs 将jobs打包将job.tar文件复制到新Jenkins服务器相同目录下解压tar包 tar-zxvfjob.tar登录新JenkinsJenkins-系统管理-读取配置,只有点击了读取配置,原
一、动态生成Slave1.1、简介之前我们都是在物理机或者虚拟机上部署jenkins,但是这种部署方式会有一些难点,如下:主Master发生单点故障时,整个流程都不可用了每个Slave的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是
from jenkins import Jenkins# 判断job是否运行结束def build():    job = 'branch-deploy-wap'    params = {        'server_ip': '10.160.30.XXX',        'server_username': 'root',        'server_userpass&#
背景client端执行webUI自动化测试时依赖操作系统上安装了对应的浏览器,并且浏览器与驱动要进行版本的对应——而selenium是可以部署集群,通过远程的方式执行对应的自动化用例,方便高效。原理1、通过代码可知,自动化运行的主类接收了任务id,获取到任务信息后根据任务类型判断进行接口
背景工具选择架构设计及技术实现参数设计断言持续集成测试集编写总结  一、背景1.目前公司发展比较迅速,还处于不停堆业务阶段,所以迭代比较频繁,导致人工回归的成本越来越大2.在有限的测试资源情况下,开发自测的需求占比不低,后端频繁发布容易心里没底
本地pycharm打开项目,运行自动化项目下载项目代码,并用pycharm打开项目gitclonehttps://gitee.com/iread9527/iInterface_python.git进入iInterface_python目录下,cdiInterface_python使用pip3install-rrequirements.txt命令,安装python项目依赖的第三方库使
Jenkins邮件设置一、简介最近有朋友问Jenkins邮件设置的问题,想起来当时也是碰到不少坑,网上看了很多博客说的解决办法根本没有用。最后我解决了这个问题,在此记录一下,希望能够帮助到在网上搜了半天仍然徒劳无功的朋友们,我懂那种失败了一次又一次的感觉,希望能帮到大家。二、配置步