大概的思路:
1.Jenkins拉取git代碼,自動構建
2.構建成功后,將程序/jar包上傳到測試服務器,並在測試服務器執行部署腳本
3.以上完成后,觸發自動化測試,由jenkins中的另一個任務觸發
4.例如在一台jenkins 的slave上(windows)觸發執行自動化測試腳本,測試完成后,將報告發送到Jenkins中設置的人員以及在jenkins中展示
一。jenkins中的設置
郵件通知的設置
注:這里的Password不是郵箱的密碼,而是郵箱的授權碼,可以百度下怎么獲取
測試服務器的設置
設置完畢后,可以點擊test configuration進行測試,查看是否能連得到
主工程的設置(需要構建的項目)
參數化構建,通過提交的分支或者tag進行部署,當然也可以選擇revision
源碼的配置
構建腳本
rm -rf ./dist rm -rf ./dist.zip npm install npm run build cd $WORKSPACE/ echo "GIT_COMMIT: " > dist/git.txt echo $GIT_COMMIT >> dist/git.txt echo -e "\nGIT_URL: " >> dist/git.txt echo ${GIT_URL#*xxxxxx.com.cn} >> dist/git.txt zip -r dist.zip dist
前端項目,通過npm進行打包,另外需要將當前的版本號打包進去
構建完成后需要執行的內容
歸檔成品,也可以不需要
執行的另一個project,也就是執行自動化測試的project
通過publish over ssh將dist.zip傳到我們的測試服務器並執行部署腳本,需要注意執行的腳本的權限問題
自動化測試工程的設置
指定在哪一台slave執行,windows是我創建的一台windows測試機
源碼我沒有設置,因為只是臨時搭建下,我直接把測試代碼放在了測試機上,實際上,應該通過svn或者其他方式拉取到測試機上,每次執行自動化測試的時候拉取最新的測試代碼
執行自動化測試腳本
jenkins中的報告展示,設置報告的路徑
設置郵件通知
獨立設置的收件人郵箱
郵件的正文以及將日志和測試報告作為附件
二。測試代碼
和之前的思路也差不多,unittest、htmltestrunner這些
新加的東西:將每個頁面的元素都配置在一個py中,引入蟲師的poium
如果能通過name或者id定位到元素最好,xpath不是很穩定(前端布局修改時,xpath可能會造成變更)
#coding:utf-8 from poium import Page,PageElement,PageWait class loginPage(Page): userNameInput = PageElement(xpath = '//*[@id="app"]/div/div/form/div[1]/div/div[1]/input',timeout=5,describe='登錄用戶名輸入框') passwordInput = PageElement(xpath = '//*[@id="app"]/div/div/form/div[2]/div/div[1]/input',timeout=5,describe='用戶密碼輸入框') loginButton = PageElement(xpath = '//*[@id="app"]/div/div/form/div[3]/div/button',describe='登錄按鈕') showPWDButton = PageElement(xpath = '//*[@id="app"]/div/div/form/div[2]/div/span',describe='明密文切換按鈕')
判斷case是否通過的方式,從檢查特定元素是否存在改為,預設正常情況下的屏幕截圖,和實際執行操作時的屏幕截圖進行對比,通過相似度進行判斷,相似度的設置需要自己斟酌下
#coding:utf-8 import os from PIL import Image import math import operator from functools import reduce def takeDiff(pic1,pic2): image1 = Image.open(pic1) image2 = Image.open(pic2) histogram1 = image1.histogram() histogram2 = image2.histogram() differ = math.sqrt(reduce(operator.add, list(map(lambda a, b: (a - b) ** 2, histogram1, histogram2))) / len(histogram1)) if differ <19: return True else: return False
將一個模塊的用例放在一個py文件中(只是我的做法是這樣)
#coding:utf-8 import unittest from selenium import webdriver from HTMLTestRunner_cn import HTMLTestRunner import time from common import common,base_page import os #截圖存放位置 spath = r'C:/python/BI_auto/screenshot/login' class LoginTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.loginPage = base_page.loginPage(self.driver) self.homePage = base_page.homePage(self.driver) self.loginPage.get('xxxxxxx.com.cn/#/login') self.driver.maximize_window() def tearDown(self): self.driver.close() def add_img(self): self.imgs.append(self.driver.get_screenshot_as_base64()) return True def cleanup(self): pass def test_login_03(self): u'''檢查顯示密碼按鈕''' try: self.loginPage.passwordInput = 'admin' self.loginPage.showPWDButton.click() time.sleep(3) self.driver.get_screenshot_as_file(spath + '點擊顯示密碼按鈕.png') #截圖對比結果,如果差異值小於9則認為相同(admin密碼明密文顯示差異值在10) diffResult = common.takeDiff(spath + '點擊顯示密碼按鈕.png',r'C:/python/BI_auto/testPic/login_03.png') #刪除用作對比時的截圖 os.remove(spath + '點擊顯示密碼按鈕.png') #self.assertEqual(diffResult,1,'點擊顯示密碼按鈕,密碼沒有變為明文') self.assertTrue(diffResult,'點擊顯示密碼按鈕,密碼沒有變為明文') except: #self.driver.get_screenshot_as_file(spath+'03_點擊顯示密碼,密碼沒有變為明文.png') self.add_img() raise
我設置的路徑都是絕對路徑,應該用相對路徑
對元素的操作完畢后,截圖,和預設的圖片進行對比,對比完成后將截圖刪除,再對比較結果進行判斷
如果相似度過低,則將現在的屏幕截圖保存到報告中
用例的執行統一放到all_test中
#coding=utf-8 import unittest import sys import os sys.path.append("/test_case") #添加test_case目錄 from testcase import login,importDB #import HTMLTestRunner from HTMLTestRunner_cn import HTMLTestRunner import time alltestnames = [login.LoginTest] # alltestnames = [login.LoginTest, # importDB.ImportDBTest # ] testunit = unittest.TestSuite() for test in alltestnames: testunit.addTest(unittest.makeSuite(test)) timestr = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time())) #filename = r'C:/python/BI_auto/report/'+timestr+ r'.html' filename = r'C:/workspace/bi_UI_auto/report/'+ r'newest.html' fp = open(filename,'wb') runner = HTMLTestRunner( stream=fp, title='BI測試報告', description='report', verbosity=2 ) runner.run(testunit) fp.close() print('執行完畢,報告路徑:'+filename)
一樣,路徑的問題需要自己再調整下,jenkins中自動化測試的project中需要做的也就是獲取最新的測試代碼(需要修改代碼中的路徑設置)然后執行這個all_test.py
三。執行結果
構建、部署、測試完畢后,會有郵件發送
在jenkins中也能看到本次的報告
執行失敗的用例,點擊顯示截圖能看到測試時的截圖