Python unittest装饰器实现原理及代码
1、前言
前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。
于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。
2、@classmethod 装饰器中的 setUpClass() 和 tearDownClass() 与 setUp() 和 tearDown() 的区别
setUp():每个测试 case 运行之前运行 tearDown():每个测试 case 运行完之后执行 setUpClass():必须使用 @classmethod 装饰器, 所有 case 运行之前只运行一次 @是修饰符,classmethod 是 python 里的类方法 tearDownClass():必须使用 @classmethod 装饰器, 所有 case 运行完之后只运行一次import unittestclass Test(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print('-----开始执行用例-----') def setUp(self) -> None: print('执行用例准备动作...') def test01(self): print('第一条用例正在执行...') def test02(self): print('第二条用例正在执行...') def tearDown(self) -> None: print('用例执行完结动作...') @classmethod def tearDownClass(cls) -> None: print('-----用例执行结束-----') if __name__ == ’__main__’: unittest.main()#执行结果如下:'''-----开始执行用例-----执行用例准备动作...第一条用例正在执行...用例执行完结动作...执行用例准备动作...第二条用例正在执行...用例执行完结动作...-----用例执行结束-----'''
from selenium import webdriverimport unittestfrom time import sleepclass DymLogin(unittest.TestCase): @classmethod def setUpClass(cls) -> None: ''' 所有的用例只需要执行一次打开浏览器操作 ''' print('Test start...') cls.dr = webdriver.Chrome() cls.dr.get('http://www.duoyoumi.com/') cls.dr.implicitly_wait(10) cls.dr.maximize_window() cls.dr.find_element_by_class_name('login').click() sleep(1) @classmethod def tearDownClass(cls) -> None: sleep(2) cls.dr.quit() print('Test end...') def test_login01(self): ''' 账号密码都为空 ''' self.dr.find_element_by_name('loginName').clear() self.dr.find_element_by_name('loginPwd').clear() self.dr.find_element_by_xpath(’//*[@id='loginForm']/div/div/div/div[2]/div[1]/div[2]’).click() #登录操作 TipsMsg = self.dr.find_element_by_class_name('promptLogin').text self.assertEqual(TipsMsg,'-请输入登录账号!',msg='Test_login01 login exception') def test_login02(self): ''' 账号正确,密码为空 ''' self.dr.find_element_by_name('loginName').clear() self.dr.find_element_by_name('loginPwd').clear() self.dr.find_element_by_name('loginName').send_keys('17779828887') self.dr.find_element_by_xpath(’//*[@id='loginForm']/div/div/div/div[2]/div[1]/div[2]’).click() # 登录操作 TipsMsg = self.dr.find_element_by_class_name('promptLogin').text self.assertEqual(TipsMsg, '-请输入密码!', msg='Test_login02 login exception') def test_login03(self): ''' 账号密码都正确 ''' self.dr.find_element_by_name('loginName').clear() self.dr.find_element_by_name('loginPwd').clear() self.dr.find_element_by_name('loginName').send_keys('17779828887') self.dr.find_element_by_name('loginPwd').send_keys('zy295240???') self.dr.find_element_by_xpath(’//*[@id='loginForm']/div/div/div/div[2]/div[1]/div[2]’).click() #登录操作 sleep(2) TipsMsg = self.dr.find_element_by_css_selector('#w_nav_temp_1000 > div.fr.dl > a:nth-child(4)').text self.assertEqual(TipsMsg,'[退出]',msg='Test_login03 login exception')if __name__ == ’__main__’: unittest.main()#执行结果如下'''Test start......Test end...----------------------------------------------------------------------Ran 3 tests in 25.253sOK'''
3、通过装饰器跳过某条用例
添加装饰器(@unittest.skip(''))
import unittestclass Test(unittest.TestCase): def setUp(self) -> None: print('---start---') def tearDown(self) -> None: print('---end---') def testbbb(self): print('case testbbb') @unittest.skip('testaaa 被跳过') def testaaa(self): print('case testaaa')if __name__ == ’__main__’: unittest.main()# 结果如下s.----------------------------------------------------------------------Ran 2 tests in 0.000sOK (skipped=1)---start---case testbbb---end---
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章:
