scope有4个作用范围:function、class、module、session
function:每个函数或方法都会调用
class:每个类只调用1次
module:每个模块只调用1次
session:多个模块调用1次,通常写在conftest中
scope=function
""" scope=function 执行顺序:setup_module ->fixture->test ->fixture->test .. """ @pytest.fixture() def login(): print('登陆') @pytest.fixture(scope='function') def logout(): print('登出') def setup_module(): print(f'setup') def test_s1(login): print('s1') def test_s2(logout): print('s2') def test_s3(): print('s3') if __name__ == '__main__': pytest.main(['-q','s001_function.py'])
运行结果:
collecting ... collected 3 items s001_function.py::test_s1 setup 登陆 PASSED [ 33%]s1 s001_function.py::test_s2 登出 PASSED [ 66%]s2 s001_function.py::test_s3 PASSED [100%]s3
scope=function使用在类中

import pytest """ scope=fuction 运行顺序:setup_method -> fixture -> test -> setup_method -> fixture -> test """ @pytest.fixture() def login(): print('登陆') @pytest.fixture(scope='function') def logout(): print('登出') class Test1: def setup_method(self): print('setup_method') def test_s1(self,login): print('s1') def test_s2(self,logout): print('s2') if __name__ == '__main__': pytest.main(['-q','s002_function_运用在class中.py'])
运行结果
collecting ... collected 2 items s002_function_运用在class中.py::Test1::test_s1 setup_method 登陆 PASSED [ 50%]s1 s002_function_运用在class中.py::Test1::test_s2 setup_method 登出 PASSED [100%]s2 ============================== 2 passed in 0.20s ==============================
scope=class
import pytest """ scope=class 1、若class中的每个test用例都调用了login,只在class所有用例执行前运行一次 2、运行顺序 setup_class -> fixture函数(整个类的运行过程中只运行一次,测试用例执行前)-> 测试用例 """ @pytest.fixture(scope='class') def login(): print('登陆') class Test2: def setup_class(self): print('setup') def test_s1(self,login): print('s1') def test_s2(self,login): print('s2') def test_s3(self): print('s3') if __name__ == '__main__': pytest.main(['-q','s003_class.py'])
运行结果:
collecting ... collected 3 items
s003_class.py::Test2::test_s1 setup
登陆
PASSED [ 33%]s1
s003_class.py::Test2::test_s2 PASSED [ 66%]s2
s003_class.py::Test2::test_s3 PASSED [100%]s3
============================== 3 passed in 0.22s ==============================
scope=module
import pytest """ scope=module:整个.py模块中login只执行一次 执行顺序:setup_module -> fixture -> tests """ @pytest.fixture(scope='module') def login(): print('登陆') def setup_module(): print('setup_module') def test_s1(login): print('s1') class Test1: def test_s2(self,login): print('s2') if __name__ == '__main__': pytest.main(['-q', 's004_module.py'])
运行结果:
collecting ... collected 2 items s004_module.py::test_s1 setup_module 登陆 PASSED [ 50%]s1 s004_module.py::Test1::test_s2 PASSED [100%]s2 ============================== 2 passed in 0.19s ==============================
scope=session
scope=session,可以跨多个.py文件,若多个py模块中的用例都调用了 fixture,只会运行一次(在调用fixture的用例开始时运行一次)
fixture(scope='session') 函数写在 conftest.py 文件中
conftest.py 文件文件名固定,放在工程根目录则是全局使用,放在某个package下,则只针对该package下的py文件有效
conftest.py
import pytest @pytest.fixture(scope='session') def gblogin(): print('gb登陆--session')
如上,test_001 和 test_005中分别调用了gblogin
test_001

import pytest """ :arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session". scope=function 执行顺序:setup_module ->fixture->test ->fixture->test .. """ @pytest.fixture() def login(): print('登陆') @pytest.fixture(scope='function') def logout(): print('登出') def setup_module(): print(f'setup') def test_s1(login): print('s1') def test_s2(logout): print('s2') def test_s3(gblogin): print('s3')
test_005

import pytest def test1(gblogin): print('s1')
执行所有测试用例:
E:\f004_fixtrue\f02_scope>pytest -s
运行结果:
collected 11 items
test_001_function.py setup
登陆
s1
.登出
s2
.gb登陆--session
s3
.
test_002_function_运用在class中.py setup_method
登陆
s1
.setup_method
登出
s2
.
test_003_class.py setup
登陆
s1
.s2
.s3
.
test_004_module.py setup_module
登陆
s1
.s2
.
test_005_session.py s1
.
================================================= 11 passed in 0.53s ==================================================