zoukankan      html  css  js  c++  java
  • 关于Selenium remote模式分布式执行UI自动化测试必定面临的性能问题

    1、大部分自动化测试人员都是在本地执行UI自动化测试,也就是代码和浏览器必须在同一台机器上,这样的的缺陷很多,无法多任务并发执行UI自动化测试用例,效率极低

    2、正是如此,Selenium 的remote模式为我们带来了解决办法(俗称Selenium gird)工作原理就是分布式的,由一个中央控制器来控制多个节点机器(用例执行机)来同时多任务并发执行UI自动化测试用例,详见博客:(http://www.cnblogs.com/zw520ly/p/5995708.html

    3、虽然这样解决了多任务并发的问题,减少了测试时间,减轻了中央控制器的负载压力,但是又带来另外一个性能问题,节点机器(用例执行机)有很大的风险出现内存溢出,具体原因我来分析一下:Selenium驱动浏览器靠的是第三方插件driver(对应到不同的浏览器有不同的driver),这个driver启动时会在节点机器上另起一个进程,用来驱动浏览器工作,通常执行测试完毕后,我们会调用driver.quit()和driver.close()关闭driver的进程和退出浏览器,【quit()方法会退出浏览器并且杀死driver的进程,但是它只会杀死当前的driver进程close()方法纯粹关闭当前浏览器,不会杀死当前driver进程,如果不处理,driver进程永久占用内存资源】,看上去driver.quit()方法似乎很完美的解决了我们的问题,但是你的测试用例(代码)在执行过程中异常终止,你的driver进程被永久保存下来,测试用例异常终止的次数多了,driver进程把你的内存占用的也差不多了,节点机器(用例执行机)卡顿、死机就是家常便饭了。

    4、我们该如何解决节点机器(用例执行机)出现的内存溢出的问题,解决办法,每次执行用例之前或者执行完用例之后通过telnet远程到节点机器(用例执行机)执行shell或dos命令,关闭driver的进程和浏览器进程(taskkill /f /t /IM chrome.exe    taskkill /f /t /IM chromedriver.exe),做的更保险一点,每次执行完用例之后调用driver.quit()方法,双保险,保证每次driver和浏览器都被正常关闭。

    代码片段:

    @Test
    public void test1() throws Exception {

    //telnet远程win主机的工具类
    TelnetUtils telnetUtils = new TelnetUtils("VT220", ">");

    //杀死浏览器进程
    telnetUtils.excuteWinCmd("172.19.21.216", "23", "xxxx", "xxxx","taskkill /f /t /IM chrome.exe");

    //杀死driver进程
    telnetUtils.excuteWinCmd("172.19.21.216", "23", "xxxx", "xxxx","taskkill /f /t /IM chromedriver.exe");

    //构建用例对象
    WebUiEntity entity = new WebUiEntity();
    entity.setId("username");
    entity.setElementAction("sendKeys");
    entity.setElementValue("xxxx");
    WebUiEntity entity1 = new WebUiEntity();
    entity1.setId("password");
    entity1.setElementAction("sendKeys");
    entity1.setElementValue("xxxx");
    WebUiEntity entity2 = new WebUiEntity();
    entity2.setName("submitLogin");
    entity2.setElementAction("click");
    WebUiEntity entity3 = new WebUiEntity();
    entity3.setId("patient_management");
    entity3.setElementAction("click");
    entity3.setCaseFunction("{WaitElement}[waitElementPresence]<>()");
    WebUiEntity entity4 = new WebUiEntity();
    entity4.setIframe("paFrame");
    entity4.setId("patiName");
    entity4.setElementAction("sendKeys");
    entity4.setElementValue("自动化测试患者");

    WebUiEntity entity5 = new WebUiEntity();
    entity5.setId("Account_box");
    entity5.setCaseFunction("{JavaScriptExecute}[changeStyle]<String;String>(display;block)");
    WebUiEntity entity6 = new WebUiEntity();
    entity6.setClassName("i-exit1");
    entity6.setCaseInformation("退出登录");
    entity6.setElementAction("click");
    entity6.setCaseFunction("{WaitElement}[fixedWait]<String>(4000)");

    WebUiDriver webUiDriver = new WebUiDriver("", "", "chrome",
    "https://passporttest.pawjzs.com/login?targetType=wanjiaB_SZ&service=https%3A%2F%2Fmyclinictest.pawjzs.com%2F");
    PageElement pageElement = new PageElement();
    pageElement.elementAction(webUiDriver.driver, entity);
    pageElement.elementAction(webUiDriver.driver, entity1);
    pageElement.elementAction(webUiDriver.driver, entity2);
    pageElement.elementAction(webUiDriver.driver, entity3);
    pageElement.elementAction(webUiDriver.driver, entity4);
    pageElement.elementAction(webUiDriver.driver, entity5);
    pageElement.elementAction(webUiDriver.driver, entity6);
    //安全退出【当前】driver进程并关闭当前浏览器
    webUiDriver.driver.quit();
    }

  • 相关阅读:
    2018年3月至4月小结
    前端面试中,经常看到垂直居中与水平居中,实际排版用的多吗?
    Hbuilder配置识别逍遥安卓模拟器
    php静态变量与方法与phar的使用
    切面反射获取方法
    Spring:源码解读Spring IOC原理
    怎样批量提取JPG照片的文件名
    如何1秒批量提取电脑文件夹中的所有文件、文件夹名字到txt/excel
    用powermock 方法中new对象
    springboot单元测试自动回滚:@Transactional
  • 原文地址:https://www.cnblogs.com/zw520ly/p/8888694.html
Copyright © 2011-2022 走看看