看上一篇的评论知道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装饰器的效果, 想来只是实现起来相对来说较为麻烦;