Python unittest装饰器实现原理及代码
1、前言
前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。
于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。
2、@classmethod装饰器中的setUpClass()和tearDownClass()与setUp()和tearDown()的区别
- setUp():每个测试case运行之前运行
- tearDown():每个测试case运行完之后执行
- setUpClass():必须使用@classmethod装饰器,所有case运行之前只运行一次
- @是修饰符,classmethod是python里的类方法
- tearDownClass():必须使用@classmethod装饰器,所有case运行完之后只运行一次
importunittest
classTest(unittest.TestCase):
@classmethod
defsetUpClass(cls)->None:
print("-----开始执行用例-----")
defsetUp(self)->None:
print("执行用例准备动作...")
deftest01(self):
print("第一条用例正在执行...")
deftest02(self):
print("第二条用例正在执行...")
deftearDown(self)->None:
print("用例执行完结动作...")
@classmethod
deftearDownClass(cls)->None:
print("-----用例执行结束-----")
if__name__=='__main__':
unittest.main()
#执行结果如下:
"""
-----开始执行用例-----
执行用例准备动作...
第一条用例正在执行...
用例执行完结动作...
执行用例准备动作...
第二条用例正在执行...
用例执行完结动作...
-----用例执行结束-----
"""
fromseleniumimportwebdriver
importunittest
fromtimeimportsleep
classDymLogin(unittest.TestCase):
@classmethod
defsetUpClass(cls)->None:
"""
所有的用例只需要执行一次打开浏览器操作
"""
print("Teststart...")
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
deftearDownClass(cls)->None:
sleep(2)
cls.dr.quit()
print("Testend...")
deftest_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_login01loginexception")
deftest_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_login02loginexception")
deftest_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_login03loginexception")
if__name__=='__main__':
unittest.main()
#执行结果如下
"""
Teststart...
...
Testend...
----------------------------------------------------------------------
Ran3testsin25.253s
OK
"""
3、通过装饰器跳过某条用例
添加装饰器(@unittest.skip(""))
importunittest
classTest(unittest.TestCase):
defsetUp(self)->None:
print("---start---")
deftearDown(self)->None:
print("---end---")
deftestbbb(self):
print("casetestbbb")
@unittest.skip("testaaa被跳过")
deftestaaa(self):
print("casetestaaa")
if__name__=='__main__':
unittest.main()
#结果如下
s.
----------------------------------------------------------------------
Ran2testsin0.000s
OK(skipped=1)
---start---
casetestbbb
---end---
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。