1、前言
前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。
于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。
2、@classmethod 装饰器中的 setUpClass() 和 tearDownClass() 与 setUp() 和 tearDown() 的区别
- setUp():每个测试 case 运行之前运行
- tearDown():每个测试 case 运行完之后执行
-
setUpClass():必须使用 @classmethod 装饰器, 所有 case 运行之前只运行一次
- @是修饰符,classmethod 是 python 里的类方法
- tearDownClass():必须使用 @classmethod 装饰器, 所有 case 运行完之后只运行一次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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() #执行结果如下: """ -----开始执行用例----- 执行用例准备动作... 第一条用例正在执行... 用例执行完结动作... 执行用例准备动作... 第二条用例正在执行... 用例执行完结动作... -----用例执行结束----- """ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
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(""))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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 - - - |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/ZhengYing0813/p/12343875.html