看上一篇的評論知道unittest裝飾器(也叫修飾器)也能解決類似的問題,陽陽就特地學習了一下關於@classmethod裝飾器的用法,並簡單介紹一下unittest本身的裝飾器;
感謝“上海-悠悠”的博客,Selenium2+python自動化55-unittest之裝飾器(@classmethod)
根據陽陽虛心學習的結果,重新設計代碼如下:
1 @classmethod 2 def setUpClass(cls): 3 cls.driver = webdriver.Firefox() 4 cls.driver.implicitly_wait(30) 5 cls.base_url = "http://xxx.xxxx.com" 6 cls.verificationErrors = [] 7 cls.accept_next_alert = True 8 9 def test_1_login(self): 10 driver = self.driver 11 driver.get(self.base_url ) 12 ... 13 #登錄段操作 14 ... 15 16 def test_2_update(self): 17 driver = self.driver 18 ... 19 #修改個人信息段操作 20 ... 21 22 @classmethod 23 def tearDownClass(cls): 24 cls.driver.quit()
上訴代碼運行的順序就是從上至下,而不再是每次執行完成一個testcase之后,執行一次teardownClass再進行下一個testcase;
這樣一來退出瀏覽器僅僅執行一次即可,這樣有一個不好的地方就是,teardownClass這個函數不能再進行每個測試用例的終結操作,比如:修改個人信息后恢復到登錄成功后的狀態,對當前測試用例的異常處理等;
陽陽嘗試tearDownClass后增加如下代碼:
def tearDown(self): self.driver.refresh() self.assertEqual( [], self.verificationErrors )
然后果然每次測試用完成都會刷新當前頁面,這樣一來,每一個testcase的用例都能被終結函數tearDown結束,最后再執行tearDownClass關閉測試瀏覽器;
需要說明的是:@classmethod是python本身的裝飾器,所以他不要使用隸屬於unit test框架下斷言assertEqual;
unittest本身也帶有裝飾器unittest.skip(),專門用於跳過testcase的裝飾器,其用法如下:
@unittest.skip(reason), skip裝飾器:直接跳過裝飾下的testcase,reason用來說明原因,下同。
@unittest.skipIf(condition,reason), skipIf裝飾器:condition條件為True時,跳過裝飾下的testcase,計入skip的testcase執行次數。
@unittest.skipUnless(condition,reason),skipUnless裝飾器:condition條件為False時,跳過裝飾下的testcase,計入skip的testcase執行次數。
@unittest.expectedFailure(), expectedFailure裝飾器:執行裝飾下的testcase,執行失敗則跳過該testcase,計入expected下成敗的testcase次數。
陽陽認為使用@unittest.skipIf或者@unittest.skipUnless應該也能實現@classmethod裝飾器的效果, 想來只是實現起來相對來說較為麻煩;