前言

前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。

于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。

 

一、装饰器

1.用setUp与setUpClass区别

setup():每个测试case运行前运行

teardown():每个测试case运行完后执行

setUpClass():必须使用@classmethod 装饰器,所有case运行前只运行一次

tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次

2.@是修饰符,classmethod是python里的类方法

 

二、执行顺序

1.用类方法写几个简单case,可以对比这篇:​​Selenium2+python自动化52-unittest执行顺序​

# coding:utf-8

import unittest

import time

class Test(unittest.TestCase):

    @classmethod

    def setUpClass(cls):

        print "start!"

   

    @classmethod

    def tearDownClass(cls):

        time.sleep(1)

        print "end!"


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

2.从执行结果可以看出,前置和后置在执行用例前只执行了一次。

start!

执行测试用例01

执行测试用例02

执行测试用例03

...end!


----------------------------------------------------------------------

Ran 3 tests in 1.001s

 

三、selenium实例

1.可以把打开浏览器操作放到前置setUpClass(cls)里,这样就可以实现打开一次浏览器,执行多个case了

# coding:utf-8

from selenium import webdriver

from selenium.webdriver.support import expected_conditions as EC

import unittest

class BolgHome(unittest.TestCase):

    u'''博客首页'''

    @classmethod

    def setUpClass(cls):

        cls.driver = webdriver.Firefox()

        url = "http://www.cnblogs.com/yoyoketang/"

        cls.driver.get(url)

        cls.driver.implicitly_wait(30)


    @classmethod

    def tearDownClass(cls):

        cls.driver.quit()


    def test_01(self):

        u'''验证元素存在:博客园'''

        locator = ("id", "blog_nav_sitehome")

        text = u"博客园"

        result = EC.text_to_be_present_in_element(locator, text)(self.driver)

        self.assertTrue(result)


    def test_02(self):

        u'''验证元素存在:首页'''

        locator = ("id", "blog_nav_myhome")

        text = u"首页"

        result = EC.text_to_be_present_in_element(locator, text)(self.driver)

        self.assertTrue(result)


if __name__ == "__main__":

    unittest.main()

 

学习过程中有遇到疑问的,可以加selenium(python+java) QQ群交流:646645429