unittest中的setUp可以在每个测试方法运行前执行,有效的减少了代码量。但有个弊端,比如打开浏览器操作,执行每个测试方法前都要重新打开一次,这样就会浪费很多时间。
是否可以只打开一次浏览器,执行完所有的测试方法后再关闭浏览器呢?这里就需要用到装饰器(@classmethod)来解决了。
一、装饰器(@classmethod)
1)setUp与setUpClass的区别
- setup(self):每个测试方法运行前都会运行一次。
- teardown(self):每个测试方法运行完之后都会执行一次。
- setUpClass(cls):与装饰器@classmethod 一起使用,在所有测试方法运行前运行,且只运行一次。
- tearDownClass(cls):与装饰器@classmethod 一起使用,在所有测试方法运行完之后运行,且只运行一次
2)在类中的方法上加上@classmethod,用来表示该方法是类方法。
二、执行顺序
import unittest
class Demo(unittest.TestCase):
def setUp(self):
print("setUp!")
def tearDown(self):
print("tearDown!")
@classmethod
def setUpClass(cls):
print("setUpClass!")
@classmethod
def tearDownClass(cls):
print("tearDownClass!")
def test01(self):
print("执行测试用例01")
def test03(self):
print("执行测试用例03")
def test02(self):
print("执行测试用例02")
def addtest(self):
print("add方法")
if __name__ == "__main__":
unittest.main()
从上述执行结果可以看出,setUpClass和tearDownClass只执行了一次。
三、案例演示
以打开百度搜索页为例,判断title是否完全等于期望结果。
from selenium import webdriver
import unittest
import time
class Demo(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.get('https://www.baidu.com')
time.sleep(3)
@classmethod
def tearDownClass(cls):
time.sleep(1)
cls.driver.quit()
def test01(self):
title = self.driver.title
self.assertEqual(title, '百度一下')
def test02(self):
title = self.driver.title
self.assertEqual(title, '百度一下,你就知道')
if __name__ == '__main__':
unittest.main()