26-unittest之装饰器(@classmethod)

发布于:2024-06-07 ⋅ 阅读:(107) ⋅ 点赞:(0)

        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()