1、前言
前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。
于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。
2、@classmethod 装饰器中的 setUpClass() 和 tearDownClass() 与 setUp() 和 tearDown() 的区别
setUp():每个测试 case 运行之前运行 tearDown():每个测试 case 运行完之后执行 setUpClass():必须使用 @classmethod 装饰器, 所有 case 运行之前只运行一次 @是修饰符,classmethod 是 python 里的类方法 tearDownClass():必须使用 @classmethod 装饰器, 所有 case 运行完之后只运行一次
import unittest
class 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 webdriver
import unittest
from time import sleep
class 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.253s
OK
"""
3、通过装饰器跳过某条用例
添加装饰器(@unittest.skip(""))
import unittest
class 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.000s
OK (skipped=1)
---start---
case testbbb
---end---
您可能感兴趣的文章:Python unittest生成测试报告过程解析Python unittest如何生成HTMLTestRunner模块Python unittest discover批量执行代码实例python 解决pycharm运行py文件只有unittest选项的问题Python + Requests + Unittest接口自动化测试实例分析Python单元测试工具doctest和unittest使用解析Python中Unittest框架的具体使用对python的unittest架构公共参数token提取方法详解