pytest夹具fixture

发布时间 2024-01-07 15:52:54作者: 测试开发孵化园

1.pytest夹具fixture

夹具:在用例执行之前,执行之后,自动的运行代码

1.1 创建fixture

  1. python函数+fixture装饰器

前后之分:yield

1 import pytest
2 
3 @pytest.fixture
4 def func():
5     print('我是前置代码,在用例开始之前,执行【启动浏览器、链接数据库,创建测试数据...】')
6     yield
7     print('我是后置代码,在用例开始之后,执行【关闭浏览器、断开数据库、删除测试数据】')

1.2 使用fixture

1 def test_A(func):
2     #print('我开始执行用例') #启动浏览器
3     assert 1==1
4     #print('我执行结束了') #关闭浏览器

1.3 fixture的作用范围

pytest的fixture,支持5级作用域(unittest支持3级),让用例共享fixture

  1. functions:每个用例不共享fixture的返回值,默认
  2. class:每个类中的用例,共享fixture
  3. modulel:每个模块(文件)中的用例,共享fixture
  4. packages:每个包(目录)中的用例,共享fixture
  5. 1

1.3.1 function

 1 import pytest
 2 
 3 @pytest.fixture(scope="function")
 4 def func():
 5     print('我是前置代码,在用例开始之前,执行【启动浏览器、链接数据库,创建测试数据...】')
 6     print('我开始执行用例') #启动浏览器
 7     yield
 8     print('我执行结束了') #关闭浏览器
 9     print('我是后置代码,在用例开始之后,执行【关闭浏览器、断开数据库、删除测试数据】')
10 
11 
12 @pytest.mark.skip
13 def test_A(func):
14     #print('我开始执行用例') #启动浏览器
15     assert 1==1
16     #print('我执行结束了') #关闭浏览器
17 
18 @pytest.mark.skip
19 def test_B(func):
20     #print('我开始执行用例') #连接数据库
21     assert 1 == 2
22     #print('我执行结束了') #关闭数据库连接
23 
24 @pytest.mark.skip
25 def test_C(func):
26     #print('我开始执行用例') #连接数据库
27     assert 3 == 3
28     #print('我执行结束了') #关闭数据库连接

1.3.2 class

 1 import pytest
 2 
 3 @pytest.fixture(scope="class")
 4 def func():
 5     print('我是前置代码,在用例开始之前,执行【启动浏览器、链接数据库,创建测试数据...】')
 6     print('我开始执行用例') #启动浏览器
 7     yield
 8     print('我执行结束了') #关闭浏览器
 9     print('我是后置代码,在用例开始之后,执行【关闭浏览器、断开数据库、删除测试数据】')
10 
11 
12 @pytest.mark.skip
13 def test_A(func):
14     #print('我开始执行用例') #启动浏览器
15     assert 1==1
16     #print('我执行结束了') #关闭浏览器
17 
18 @pytest.mark.skip
19 def test_B(func):
20     #print('我开始执行用例') #连接数据库
21     assert 1 == 2
22     #print('我执行结束了') #关闭数据库连接
23 
24 @pytest.mark.skip
25 def test_C(func):
26     #print('我开始执行用例') #连接数据库
27     assert 3 == 3
28     #print('我执行结束了') #关闭数据库连接
29 
30 
31 class TestA:
32     def test_a(self,func):
33         pass
34 
35     def test_b(self,func):
36         pass

1.3.3 module

 1 import pytest
 2 
 3 @pytest.fixture(scope="module")
 4 def func():
 5     print('我是前置代码,在用例开始之前,执行【启动浏览器、链接数据库,创建测试数据...】')
 6     print('我开始执行用例') #启动浏览器
 7     yield
 8     print('我执行结束了') #关闭浏览器
 9     print('我是后置代码,在用例开始之后,执行【关闭浏览器、断开数据库、删除测试数据】')
10 
11 
12 def test_A(func):
13     #print('我开始执行用例') #启动浏览器
14     assert 1==1
15     #print('我执行结束了') #关闭浏览器
16 
17 def test_B(func):
18     #print('我开始执行用例') #连接数据库
19     assert 1 == 2
20     #print('我执行结束了') #关闭数据库连接
21 
22 def test_C(func):
23     #print('我开始执行用例') #连接数据库
24     assert 3 == 3
25     #print('我执行结束了') #关闭数据库连接
26 
27 
28 class TestA:
29     def test_a(self,func):
30         pass
31 
32     def test_b(self,func):
33         pass

1.3.4 package

 1 #test_add.py
 2 
 3 import pytest
 4 
 5 
 6 def add(a, b):  # 计算a+b的结果
 7     return a + b
 8 
 9 
10 @pytest.mark.parametrize(
11     "a,b",
12     [
13         (1, 1),
14         (3, 5),
15         ('3', '5'),
16         (None, '5'),
17         (None, False)
18     ]
19 )
20 def test_1(a, b,func):
21     # a = 1
22     # b = 1
23     c = add(a, b)
24     assert c == a + b
25 
26 #test_fixture.py
27 
28 import pytest
29 
30 def test_A(func):
31     #print('我开始执行用例') #启动浏览器
32     assert 1==1
33     #print('我执行结束了') #关闭浏览器
34 
35 def test_B(func):
36     #print('我开始执行用例') #连接数据库
37     assert 1 == 2
38     #print('我执行结束了') #关闭数据库连接
39 
40 def test_C(func):
41     #print('我开始执行用例') #连接数据库
42     assert 3 == 3
43     #print('我执行结束了') #关闭数据库连接
44 
45 
46 class TestA:
47     def test_a(self,func):
48         pass
49 
50     def test_b(self,func):
51         pass
52 
53 #conftest.py
54 
55 import pytest
56 
57 @pytest.fixture(scope="package")
58 def func():
59     print('我是前置代码,在用例开始之前,执行【启动浏览器、链接数据库,创建测试数据...】')
60     print('我开始执行用例') #启动浏览器
61     yield
62     print('我执行结束了') #关闭浏览器
63     print('我是后置代码,在用例开始之后,执行【关闭浏览器、断开数据库、删除测试数据】')