1.pytest夹具fixture
夹具:在用例执行之前,执行之后,自动的运行代码
1.1 创建fixture
- 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
- functions:每个用例不共享fixture的返回值,默认
- class:每个类中的用例,共享fixture
- modulel:每个模块(文件)中的用例,共享fixture
- packages:每个包(目录)中的用例,共享fixture
- 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('我是后置代码,在用例开始之后,执行【关闭浏览器、断开数据库、删除测试数据】')