unittest 介紹了4 個重要的概念: test case, test suite, test runner,test fixture。
1、testcase: 一個TestCase 的實例就是一個測試用例, 就是一個完整的測試流程,包括測試前准備環境的搭建(setUp),實現測試過程的代碼(run),以及測試后環境的還原(tearDown)。元測試(unittest)的本質也就在這里,一個測試用例是一個完整的測試單元,通過運行這個測試單元,可以對某一個功能進行驗證。
setUp 用於設置初始化工作,在每一個測試用例前先被執行,它與tearDown方法相呼應,后者在每一個測試用例執行后被執行。這里的初始化工作定義了瀏覽器啟動和基礎URL 地址。
def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.base_url = "https://172.1.1.1/" self.verificationErrors = [] self.accept_next_alert = True
tearDown 方法在每個測試方法執行后調用,這個方法用於完成測試用例執行后的清理工作,如退出瀏覽器、關閉驅動,恢復用例執行狀態等。在setUp()方法中定義了verificationErrors 為空數組,這里通過assertEqual()比較其是否為空,如果為空說明用例執行的過程過程中沒有出現異常,否則將拋出AssertionError 異常:
def tearDown(self): self.driver.quit() self.assertEqual([], self.verificationErrors)
2、testsuite: 對一個功能的驗證往往是需要多測試用例的,可以把多的測試用例集合在一起執行,這就產生了測試套件TestSuite 的概念,它用來組裝單個測試用例,而且TestSuite 也可以嵌套TestSuite。
testSuite()可以被看作一個容器(測試套件),通過addTest 方法我們可羅列具體所要執行的測試用例。如果使用unittest.main() 的話默認會執行所有以test 開頭的測試用例。
3、testrunner: TextTestRunner 是來執行測試用例的,其中的run(test)用來執行TestSuite/TestCase。測試的結果會保存到TextTestResult 實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息。
4、testfixture: 對一個測試用例環境的搭建和銷毀,是一個fixture,通過覆蓋TestCase 的setUp()和tearDown()方法來實現.
了解unittest框架之后,練習一個登錄的例子,代碼如下:
# coding=utf-8 from selenium import webdriver import unittest class task_a(unittest.TestCase): def setUp(self): #每個測試用例之前執行 self.driver=webdriver.Chrome() self.url="https://172.1.1.1" self.verificationErrors=[] self.accept_next_alter=True def tearDown(self): #每個測試用例之后執行 self.driver.quit() self.assertEqual([],self.verificationErrors) def test_1(self): u"測試用例1" driver=self.driver driver.get(self.url) driver.maximize_window() username='user1' driver.find_element_by_css_selector("input.login-form").send_keys(username) #定位到用戶名輸入框 driver.find_element_by_css_selector("input.passwd").send_keys('123456') #定位到密碼輸入框 driver.find_element_by_css_selector("input.btn.btn-default").click() #點擊登錄按鈕 info = driver.find_element_by_css_selector("#userMenu > div.user-id").text self.assertEqual(username, info) print("login用例執行完成") if __name__=='__main__': unittest.main()