Python Pytest自动化测试框架 @pytest.mark.skip()跳过执行

Time will tell.

一、skip 介绍

在自动化测试过程中经常会遇到功能阻塞、功能未实现、环境等一系列外部因素问题导致一些用例执行不了,这时就可以用到跳过skip用例,如果我们注释掉或删除掉,后面还要进行恢复操作。

1、skip跳过成功,标识为:

1
============================= 2 skipped in 0.04s ==============================

2、pytest.main(['-rs','test01.py']) 用 -rs 执行,跳过原因才会显示SKIPPED [1] test01.py:415:跳过 Test 类,会跳过类中所有方法。

3、skip跳过,无条件和原因@pytest.mark.skip()

4、skip跳过,无需满足条件true、有跳过原因@pytest.mark.skipif(reason=‘无条件,只有跳过原因’)。

5、skip跳过,需满足条件true、且有跳过原因@pytest.mark.skipif(条件1==1,reason=‘跳过原因’)。

6、skip赋值变量,多处调用myskip=pytest.mark.skipif(1==1,reason=‘skip赋值给变量,可多处调用’)。

然后@myskip使用。

二、跳过测试类

@pytest.mark.skip()@pytest.mark.skipif()两个标签,用它们装饰测试类:

  1. 被标记的类中所有方法测试用例都会被跳过。

  2. 被标记的类,当条件为ture时,会被跳过,否则不跳过。

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
'''
skip跳过类
'''

import pytest,sys
@pytest.mark.skip(reason='跳过Test类,会跳过类中所有方法')
class Test(object):
    def test_one(self):
        assert 1==1
    def test_two(self):
        print('test_02')
        assert 1==2
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py ss                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [2] test01.py: 跳过Test类,会跳过类中所有方法
============================= 2 skipped in 0.07s ==============================
 
Process finished with exit code 0
 
 
 
#skip满足条件,skip跳过类

import pytest,sys
@pytest.mark.skipif(1==1,reason='跳过Test类,会跳过类中所有方法')
class Test(object):
    def test_one(self):
        assert 1==1
    def test_two(self):
        print('test_02')
        assert 1==2
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py ss                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [1] test01.py:415: 跳过Test类,会跳过类中所有方法
SKIPPED [1] test01.py:417: 跳过Test类,会跳过类中所有方法
============================= 2 skipped in 0.04s ==============================
 
Process finished with exit code 0

三、跳过方法或测试用例

想要某个方法或跳过某条用例,在方法上加以下3种都可以:

  • @pytest.mark.skip() #1、跳过方法或用例,未备注原因

  • @pytest.mark.skip(reason=‘跳过一个方法或一个测试用例’) #2、跳过方法或用例,备注了原因

  • @pytest.mark.skipif(1==1,reason=‘跳过一个方法或一个测试用例’) #3、当条件满足,跳过方法或用例,备注了原因

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
'''
1、跳过方法或用例,未备注原因
'''

import pytest,sys
class Test(object):
    @pytest.mark.skip()
    def test_one(self):
        assert 1==2
    def test_two(self):
        print('test_02')
        assert 1==1
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py s.                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [1] test01.py:414: unconditional skip
======================== 1 passed, 1 skipped in 0.04s =========================
 
Process finished with exit code 0
 
2、跳过方法或用例,备注了原因
import pytest,sys
class Test(object):
    @pytest.mark.skip(reason='跳过一个方法或一个测试用例')
    def test_one(self):
        assert 1==2
    def test_two(self):
        print('test_02')
        assert 1==1
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py s.                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [1] test01.py:414: 跳过一个方法或一个测试用例
======================== 1 passed, 1 skipped in 0.05s =========================
 
Process finished with exit code 0
 
3、当条件满足,跳过方法或用例,备注了原因
import pytest,sys
class Test(object):
    @pytest.mark.skipif(1==1,reason='跳过一个方法或一个测试用例')
    def test_one(self):
        assert 1==2
    def test_two(self):
        print('test_02')
        assert 1==1
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py s.                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [1] test01.py:414: 跳过一个方法或一个测试用例
======================== 1 passed, 1 skipped in 0.06s =========================
 
Process finished with exit code 0

四、多个 skip 时,满足1个条件即跳过

我们在类和方法上分别加了skip,类中满足条件,方法中未满足条件,所以生效类中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
import pytest,sys

@pytest.mark.skipif(1==1,reason='多个条件时,有1个条件满足就跳过(类)')
class Test(object):
    @pytest.mark.skipif(1==2, reason='多个条件时,有1个条件满足就跳过(方法)')
    def test_one(self):
        assert 1==2
    def test_two(self):
        print('test_02')
        assert 1==1
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py ss                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [1] test01.py:418: 多个条件时,有1个条件满足就跳过(类)
SKIPPED [1] test01.py:415: 多个条件时,有1个条件满足就跳过(类)
============================= 2 skipped in 0.04s ==============================

五、skip 赋值给变量,可多出调用

无论是@pytest.mark.skip()标签还是@pytest.mark.skipif()标签,如果你想在多个测试方法上装饰,依次写起来很麻烦的话,你可以选择定义个变量让它等于标签,然后在装饰的时候用该变量代替标签。

这种方法你还可以通过在其他模块中导入的变量的方式,在其他模块中共享标签。如果可以这样的话,那为什么不新建一个模块用来存放标签呢?这样是不是又方便了许多。

赋值:myskip=pytest.mark.skipif(1==1,reason=‘skip赋值给变量,可多处调用’)

调用:@myskip

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
import pytest,sys
myskip=pytest.mark.skipif(1==1,reason='skip赋值给变量,可多处调用')
class Test(object):
    @myskip
    def test_one(self):
        assert 1==2
    def test_two(self):
        print('test_02')
        assert 1==1
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py s.                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [1] test01.py:415: skip赋值给变量,可多处调用
======================== 1 passed, 1 skipped in 0.07s =========================
 
Process finished with exit code 0

六、pytest.skip() 方法内跳过

除了通过使用标签的方式,还可以在测试用例中调用pytest.skip()方法来实现跳过,可以选择传入msg参数来说明跳过原因;如果想要通过判断是否跳过,可以写在 if 判断里(_)。

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
import pytest,sys
class Test(object):
    def test_one(self):
        pytest.skip(msg='跳过')
        assert 1==2
    def test_two(self):
        print('test_02')
        assert 1==1
if __name__=='__main__':
    pytest.main(['-rs','test01.py'])
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 2 items
 
test01.py s.                                                             [100%]
 
=========================== short test summary info ===========================
SKIPPED [1] c:\users\wangli\pycharmprojects\test\test\test01.py:416: 跳过
======================== 1 passed, 1 skipped in 0.04s =========================
 
Process finished with exit code 0

好了,以上就是今天分享的全部内容了,如果你对更多内容、及Python自动化软件测试、面试题、实例练习题感兴趣的话可以加入我们175317069一起学习。群里会有各项学习资源发放,更有行业深潜多年的技术人分析讲解。期待你的加入!

最后祝愿你能成为一名优秀的软件测试工程师!

欢迎【点赞】、【评论】、【关注】~

Time will tell.(时间会证明一切)