(一)安裝xmlrunner
使用Jenkins執行測試時,測試代碼中會用到這個模塊。
pip install xmlrunner
下文安裝Jenkins環境:Windows 10
Ubuntu安裝Jenkins可參考:https://www.cnblogs.com/clemente/p/10642760.html
親測可行。
(二)安裝jenkins
(1) 下載jekins
下載適合自己的,我是下載長期穩定版的。
(2) 解壓后運行jenkins.msi這個文件,然后一直下一步就是了。
(3) http://localhost:8080 登錄
(4) 根據提示輸入密碼后,下一步。
(6) 這里第一個應該是默認安裝jenkins community的常用插件,第二個應該是選擇需要安裝的插件。不熟悉的時候選第一個就是了。
(7) 插件安裝成功后如下圖所示。(如果這步有部分插件安裝失敗的話,就重新下載,實在安裝不了就重啟Jenkins服務(Windows的服務里重啟),然后重新登陸后跳過這步,安裝失敗的插件以后再在Jenkins的插件管理中去安裝)
(8) 安裝完成。
(三)新建任務
(1) 首頁點擊【新建】。
(2) 填寫相關信息后,點擊【確定】。
(3) 構建觸發器設置自動構建的時間。下面的是工作日每晚10點自動執行,這樣第二天早上上班就能看到測試結果了。
這里有5個參數:可以點擊后面?查看說明文檔,*代表任意時間
第一個:分鍾(0-59)
第二個:小時(0-23)
第三個:日(1-31)
第四個:月份(1-12)
第五個:星期幾(0-7,0和7都代表星期日)
(4) 構建部分增加構建步驟,這里選擇Windows批處理命令。
copy F:\Python\firstselenium\smoketest\*.py
python smoketests.py
(5) 構建后操作,增加操作步驟,選擇Publish JUnit test result report,然后在測試報告字段填寫 測試報告/*.xml。(測試報告是測試套件中配置的output參數的值,看下面的smoketests.py的代碼就知道了)這樣Jenkins每次運行測試的時候都會從這個文件夾讀取測試結果。
(6) 配置完成后點擊【保存】。
(7) 點擊下圖的【立即構建】,藍色就代表成功了。
(8) 點擊上圖的最新測試結果可以查看最新的測試結果。(也可以點擊具體Build History下面的時間,查看具體哪一次構建的測試結果,點擊藍色的球形圖標的話,可以查看控制台輸出)
下面的代碼部分,主要的就是測試套件中的這句,其他的自己隨便寫一個或幾個測試用例就行了
xmlrunner.XMLTestRunner(verbosity=2,output='測試報告').run(smoke_tests)
(四)smoketests.py
1 import unittest 2 from searchtest import SearchTest 3 from homepagetest import HomePageTest 4 from xmlrunner import xmlrunner 5 #獲取SearchTest類 和 HomePageTest類中的所有測試方法 6 search_test = unittest.TestLoader().loadTestsFromTestCase(SearchTest) 7 home_page_test = unittest.TestLoader().loadTestsFromTestCase(HomePageTest) 8 #創建一個包括SearchTest和HomePageTest的測試套件 9 smoke_tests = unittest.TestSuite([home_page_test,search_test]) 10 #運行測試套件 11 # unittest.TextTestRunner(verbosity=2).run(smoke_tests) 12 xmlrunner.XMLTestRunner(verbosity=2,output='測試報告').run(smoke_tests)
(五)searchtest.py
1 import sys 2 import unittest 3 from selenium import webdriver 4 from selenium.webdriver.common.action_chains import ActionChains 5 from selenium.webdriver.support.ui import WebDriverWait 6 class SearchTest(unittest.TestCase): 7 @classmethod 8 def setUpClass(cls): 9 cls.driver = webdriver.Chrome() 10 # cls.driver.implicitly_wait(20) 11 cls.driver.maximize_window() 12 cls.driver.get("https://www.cnblogs.com/") 13 14 def test_search_by_category(self): 15 category_list = ['Java', 'C++', 'PHP', 'Delphi', 'Python', 'Ruby',\ 16 'C語言', 'Erlang', 'Go', 'Swift', 'Scala', 'R語言', 'Verilog', '其它語言'] 17 #定位首頁網站分類中的編程語言 18 search_class = self.driver.find_element_by_xpath('//li/a[@href="/cate/2/"]') 19 #光標懸停在“編程語言”上 20 ActionChains(self.driver).move_to_element(search_class).perform() 21 WebDriverWait(self.driver, 20).until(lambda l: len(l.find_elements_by_xpath( \ 22 '//div[@id="cate_content_block_2"]/div[@class="cate_content_block"]/ul/li')) == 14) 23 # 以列表形式返回編程語言下的所有小類 24 search_small = self.driver.find_elements_by_xpath(\ 25 '//div[@id="cate_content_block_2"]/div[@class="cate_content_block"]/ul/li') 26 small_cate = [] 27 for s in search_small: 28 #去掉小類最后面的(0),並添加到列表small_cate中 29 small = str(s.text).split('(') 30 small_cate.append(small[0]) 31 #檢查表達式是否為true(此處檢查編程語言下的小類是否與預期結果一致) 32 self.assertTrue(small_cate == category_list) 33 self.assertEqual(small_cate,category_list) 34 35 def test_search_by_look(self): 36 seach_class = self.driver.find_element_by_xpath('//li/a[@href="/cate/2/"]') 37 #定位編程語言下的小類Python 38 seach_small = self.driver.find_element_by_xpath('//li/a[@href="/cate/python/"]') 39 ActionChains(self.driver).move_to_element(seach_class).click(seach_small).perform() 40 #檢查打開的網頁標題是不是 Python - 網站分類 - 博客園 41 self.assertEqual(self.driver.title,"Python - 網站分類 - 博客園" ) 42 43 @classmethod 44 def tearDownClass(cls): 45 cls.driver.quit() 46 #加上下面2句,可以通過命令行運行測試,不加的話不影響通過IDE運行測試 47 if __name__ == '__main__':51 #加verbosity=2參數,在命令行中顯示具體的測試方法 52 unittest.main(verbosity=2)
(六)homepagetest.py
1 import sys 2 import unittest 3 from selenium import webdriver 4 from selenium.common.exceptions import NoSuchElementException 5 from selenium.webdriver.common.by import By 6 class HomePageTest(unittest.TestCase): 7 @classmethod 8 def setUpClass(cls): 9 cls.driver = webdriver.Chrome() 10 cls.driver.implicitly_wait(10) 11 cls.driver.maximize_window() 12 cls.driver.get("https://www.cnblogs.com/") 13 14 def test_search_field(self): 15 #檢查博客園首頁有沒有搜索框,is_element_present()是自定義的方法 16 self.assertTrue(self.is_element_present(By.ID,"zzk_q")) 17 def test_search_btn(self): 18 # 檢查博客園首頁有沒有找找看按鈕 19 self.assertTrue(self.is_element_present(By.CLASS_NAME,"search_btn")) 20 21 # 檢查博客園首頁菜單欄信息是否與預期一致 22 def test_menu(self): 23 menu_data =['園子https://home.cnblogs.com/', '新聞https://news.cnblogs.com/', 24 '博問https://q.cnblogs.com/', '閃存https://ing.cnblogs.com/', 25 '小組https://group.cnblogs.com/', '收藏https://wz.cnblogs.com/', 26 '招聘https://job.cnblogs.com/', '班級https://edu.cnblogs.com/', 27 '找找看http://zzk.cnblogs.com/'] 28 #以列表形式返回博客園首頁菜單欄信息 29 self.check_menu = self.driver.find_elements_by_xpath('//div[@id="nav_menu"]/a') 30 the_menu = [] 31 for c in self.check_menu: 32 #將博客園首頁的菜單名稱和URL添加到列表the_menu 33 the_menu.append(c.text + c.get_attribute('href')) 34 #檢查2個列表是否一致(檢查博客園首頁的菜單名稱及URL是否和預期一致) 35 self.assertListEqual(the_menu,menu_data) 36 37 # 找到元素,返回True,否則返回False 38 def is_element_present(self,how,what): 39 try: 40 self.driver.find_element(by=how,value = what) 41 except NoSuchElementException as e: 42 return False 43 return True 44 45 @classmethod 46 def tearDownClass(cls): 47 cls.driver.quit() 48 49 # 加上下面2句,可以通過命令行運行測試,不加的話不影響通過IDE運行測試 50 if __name__ == '__main__':54 # 加verbosity=2參數,在命令行中顯示具體的測試方法 55 unittest.main(verbosity=2)