python单元测试引入unittest模块后一个类里面包含多个方法怎么只让setUp、方法只执行一次
@classmethod
def setUpClass(cls):
@classmethod
def tearDownClass(cls):
cls.driver.quit()
防吞直接放
百年风日
百年风日几重阳,我是阳阳!
【selenium】python+selenium+unittest,关于每次执行完一个测试用例都关闭浏览器等时间较长的问题之解决方案·续·装饰器
看上一篇的评论知道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.driver11 driver.get(self.base_url )12 ...13 #登录段操作14 ...15 16 def test_2_update(self):17 driver = self.driver18 ...19 #修改个人信息段操作20 ...21 22 @classmethod23 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装饰器的效果, 想来只是实现起来相对来说较为麻烦;
2017-03-30
登录放在setUp里的话每个方法执行前都要初始化那就要重复登录多次了,我希望的是一次登录执行所有方法
截张图,看看代码