如果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機子進行自動化測試,這里就不附日志了