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