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