UnitTest測試框架全棧詳解
主要的測試維度:
1、表單的錯誤提示資訊驗證
2、產品的業務邏輯
3、頁面的互動
單元測試
端元測試時最基本也是最底層的策劃型別,單元測試應用於最基本的程式碼軟體,在python中,單元測試框架主要是unit test
unittest始於標準庫,安裝了python直譯器後就可以直接匯入使用了
1、初始化
2、測試步驟
3、斷言
4、清理
如以百度搜索“趙麗穎”為例:
(1)初始化就是開啟瀏覽器,進入百度;
(2)測試步驟:就是你輸入關鍵字“馬雲”然後搜尋到相關內容的過程;
(3)斷言:就是斷言我們搜尋到的內容與輸入的關鍵字的比較("is"、"in"、"=="),斷言的方式:
A、python原生的assert斷言方法;
B、selenium原生的斷言方法:
a.saaertEqual:比較兩個物件是否相等;
b.assertIN:比較一個物件是否包含另一個物件;
c.assertTrue:針對bool型別驗證true or false;真真為真,真假為假,即斷言內容返回真,則為真,斷言內容返回假則為假。
d.assertFalse:針對bool型別驗證true or false;假假為真,假真為假,即斷言內容返回假,則為真,斷言內容返回真則為假。
(4)清理:關閉瀏覽器的過程。
測試套件:
TestSuite:在一個測試套件裡面可以包含很多的測試用例,可以把它理解為一個容器
它可以分為兩個類目:
1、按測試類來執行測試用例
import unittest from selenium import webdriver import time class SinaTest(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://mail.sina.com.cn/#') self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit() def test_login_nulll(self): # 驗證賬戶密碼為空的提示資訊 self.driver.find_element_by_id('freename').send_keys('') self.driver.find_element_by_id('freepassword').send_keys('') self.driver.find_element_by_class_name('loginBtn').click() divtest=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') time.sleep(3) self.assertEqual(divtest.text,'請輸入郵箱名') def test_login_emal_format(self): # 驗證賬戶格式不規範的提示資訊 self.driver.find_element_by_id('freename').send_keys('afafafaf') self.driver.find_element_by_id('freepassword').send_keys('dasda') self.driver.find_element_by_class_name('loginBtn').click() divtest=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') # 比較兩個物件是否相等 time.sleep(3) self.assertEqual(divtest.text,'您輸入的郵箱名格式不正確') def test_login_isButton(self): # 驗證自動登入是否預設勾選 divTest=self.driver.find_element_by_id('store1') divTest.click() # 針對布林型別驗證assertTure self.assertFalse(divTest.is_selected()) if __name__=='__main__': # 按測試類來執行 # seite=unittest.TestLoader().loadTestsFromTestCase('SinaTest')
2、按照測試模組來執行測試用例
import unittest from selenium import webdriver import time class SinaTest(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://mail.sina.com.cn/#') self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit() def test_login_nulll(self): # 驗證賬戶密碼為空的提示資訊 self.driver.find_element_by_id('freename').send_keys('') self.driver.find_element_by_id('freepassword').send_keys('') self.driver.find_element_by_class_name('loginBtn').click() divtest=self.driver.find_element_by_xpath
('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') time.sleep(3) self.assertEqual(divtest.text,'請輸入郵箱名') def test_login_emal_format(self): # 驗證賬戶格式不規範的提示資訊 self.driver.find_element_by_id('freename').send_keys('afafafaf') self.driver.find_element_by_id('freepassword').send_keys('dasda') self.driver.find_element_by_class_name('loginBtn').click() divtest=self.driver.find_element_by_xpath
('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') # 比較兩個物件是否相等 time.sleep(3) self.assertEqual(divtest.text,'您輸入的郵箱名格式不正確') def test_login_isButton(self): # 驗證自動登入是否預設勾選 divTest=self.driver.find_element_by_id('store1') divTest.click() # 針對布林型別驗證assertTure self.assertFalse(divTest.is_selected()) if __name__=='__main__': # 按測試模組來執行 seite=unittest.TestLoader().loadTestsFromTestCase('SinaTest') unittest.TextTestRunner().run(seite)
測試韌體:
測試韌體:初始化setUp(),清理tearDown()
類測試韌體:指的是不管一個測試類裡面有多少個測試用例,測試韌體只執行一次
缺點是執行完一個測試用例後,需要回歸到頁面的初始化
測試執行:
TestRunner:測試執行指的是針對測試套件或者是測試用例進行執行的過程
測試報告:
TestReport:所有的測試測試用例執行完成後輸出的彙總結果報告資訊
注意:在測試類裡面編寫測試方法必須時test開頭的
練習一、
練習二斷言
常用的斷言有:
1、比較兩個物件是否相等:assertEqual()
2、比較一個物件是否包含另一個物件:assertIn
3、比較兩個物件是否為真:asserTure()
4、比較兩個物件是否為假:assertFales()
比較兩個物件是否相等:assertEqual()
比較兩個物件是否為真:asserTure()
比較兩個物件是否為假:assertFales()
測試用例執行順序
在unittest中,測試點的執行順序是依據ascill碼來執行的,也就是說根據ASCII碼的順序載入,數字與字母的順序為:0-9,A-Z,a-z,所以以A開頭的測試用例方法會優先執行,以a開頭會後執行。也就是根據數字的大小從小到 大執行的
注意:編寫的每一個自動化測試用例都必須是獨立的,和其他的測試用例都沒有任何的依賴性
編寫測試用例注意事項
1、在一個測試類裡面,每一個測試的方法都是以test開頭的,test不能是中間或者尾部,必須是開頭,建議test_
2、每一個測試用例都應該有註釋資訊,這樣在測試報告就會顯示具體的測試點的檢查點
3、在自動化測試中,每個測試用例都必須的有斷言,五斷言的自動化測試用例是無效的
4、最好一個測試用例對應一個測試點,不要多個業務檢查點寫一個測試用例
5、如果涉及到業務邏輯的吃了,最好把業務邏輯的處理方法放在斷言前面,這樣做的目的時不要因為業務邏輯執行錯誤導斷言也失敗
6、測試用例名稱最好規範,有約束
7、是否先寫自動化測試的測試程式碼,再使用自動化測試方式寫,本人覺得沒必要,畢竟能夠做自動化測試的都具備了功能測試的劇本水平,所以沒有必要把一個業務的檢查點寫多次,浪費時間和人力成本。
自動化測試流程:
1、先梳理那些模組可以做自動化測試
2、梳理完成後,和相關的的人對下計劃以及梳理的結果
3、編寫程式碼時先梳理的測試模組
4、編寫完成後和相關人員進行程式碼評審(程式碼評審的目的是:測試場景是否考慮周全,測試斷言是否合理,程式碼編寫是否合理)
5、編寫完成後整合到jekins持續整合平臺
6、下個迭代的時候,直接可以應用於產品的迴歸測試中
引數化
1、引數化: 相同的測試步驟,不同的測試資料,那麼這樣的測試場景我們就可以使用引數化的解決思路來解決。也就是說使用一個測試用例的程式碼,執行多個測試場景。引數化需要藉助外部的parameterized的庫,安裝命令:pip3 install parameterized。
2、引數化本質:
針對測試資料進行迴圈,每次迴圈的時候對列表中的元素的值一一賦值的過程。
生成測試報告的是HTMLTestRunner
nuittest生成的測試報告需要使用到都三方的庫HTMLTestRunner,把該庫放在Python安裝目錄下的lib目錄下
import time import unittest import HTMLTestRunner import os def getSuite(): # 獲取所有需要執行的測試模組 suite=unittest.TestLoader().discover( start_dir=os.path.dirname(__file__), pattern='test_*.py') return suite def getNowTime(): return time.strftime( '%y-%m-%d %H_%M_%S', time.localtime(time.time()) ) def main(): filename=os.path.join(os.path.dirname(__file__),'report',getNowTime()+'report.html') lo=open(filename,'wb') runner=HTMLTestRunner.HTMLTestRunner( stream=lo, title='UI自動化測試報告', description='UI自動化測試報告' ) runner.run(getSuite()) if __name__=='__main__': main()
操作步驟
1、先建立一個名為report的資料夾
2、執行程式
3、執行完之後再report的資料夾中會有一個新的檔案(我們是以現在時間來命名的)
4、以HTML的格式開啟檔案(此時我們選擇使用chrome瀏覽器開啟)