1. Definición
Hay un alcance de parámetro en el accesorio de pytest, y su alcance tiene cinco, a saber: función, clase, módulo y sesión
función: se llama antes de que comience cada método, nivel de método
clase: se llamará una vez antes de que comience cada clase, nivel de clase
módulo: llamado una vez antes de que comience cada módulo (archivo py), nivel de módulo
sesión: se llamará una sesión (varios módulos) una vez antes de comenzar, nivel de paquete
二. alcance = "función"
Defina un test_function_scope.py, escriba el siguiente código y ejecútelo:
import pytest @ pytest.fixture (scope = " function " ) def function_scope (): print ( " 每个 方法 开始 之前 运行 一次" ) msg = " 测试 function_scope " return msg def test_function_scope_1 (function_scope): afirmar function_scope == " 测试function_scope " def test_function_scope_2 (function_scope): afirmar function_scope == " 测试 function_scope "
result ============================= inicia sesión de prueba ================== =========== plataforma win32 -Python 3.7.3, pytest-5.1.2, py-1.8.0, pluggy-0.12.0- D: \ program \ Python37 \ python.exe cachedir : .pytest_cache rootdir: E: \ virtual_workshop \ pytest - demo \ test_demo recolectando ... recolectó 2 elementos test_function_scope.py::test_function_scope_1 se ejecuta una vez antes de que comience cada método [ 50% ] test_function_scope.py::test_function_scope_2 cada método comienza Antes de ejecutar APROBADO [ 100% ] ============================== 2 aprobado en 0.03s ======= =======================
三. alcance = "clase"
Defina un test_class_scope.py, escriba el siguiente código y ejecútelo:
import pytest @ pytest.fixture (scope = " class " ) def class_scope (): print ( " 每个 类 开始 之前 运行 一次" ) msg = " 测试 class_scope " return msg class TestClassScope1 (): def test_class_scope_1 (self, class_scope) : afirmar class_scope == " 测试 class_scope " clase TestClassScope2 (): def test_class_scope_2 (self, class_scope): afirmar class_scope == "class_scope prueba " # Resultados de la operación ============================= sesión de pruebas se inicia ============ ================= plataforma win32 -Python 3.7.3, pytest-5.1.2, py-1.8.0, pluggy-0.12.0- D: \ program \ Python37 \ python.exe cachedir: .pytest_cache rootdir: E: \ virtual_workshop \ pytest - demo \ test_demo recolectando ... recolectó 2 elementos test_class_scope.py::TestClassScope1::test_class_scope_1 Ejecuta PASSED [ 50% ] test_class_scope antes de cada clase .py :: TestClassScope2 :: test_class_scope_2 Ejecutar PASSED una vez antes de cada clase [ 100% ] ============================== 2 pasaronen 0.03s ==============================
四. alcance = "módulo"
Defina un test_module_scope.py, escriba el siguiente código y ejecútelo:
import pytest @ pytest.fixture (scope = " module " ) def module_scope (): print ( " 每个 模块 开始 之前 运行 一次" ) msg = " 测试 module_scope " return msg class TestClassScope1 (): def test_module_scope_1 (self, module_scope) : afirman module_scope == " 测试module_scope " clase TestClassScope2 (): def test_module_scope_2 (auto, module_scope): afirman module_scope ==" module_scope prueba " # operación resultados ============================= sesión de prueba se inicia =========== ================== plataforma win32 -Python 3.7.3, pytest-5.1.2, py-1.8.0, pluggy-0.12.0- D: \ program \ Python37 \ python.exe cachedir: .pytest_cache rootdir: E: \ virtual_workshop \ pytest - demo \ test_demo2 recolectando ... recopilados 2 elementos test_module_scope.py::TestClassScope1::test_module_scope_1 Ejecuta PASSED una vez antes de que comience cada módulo [ 50% ] de test_module_scope.py::TestClassScope2::test_module_scope_2 pasado [ 100% ] ============================== 2 pasado en 0.03s ==============================
五. alcance = "sesión"
Defina un conftest.py bajo el paquete test_demo3, el código es el siguiente:
import pytest @ pytest.fixture (scope = " session " ) def session_scope (): print ( " Llamar una vez antes del inicio de una sesión (módulos múltiples) " ) msg = " Llamar una vez antes del inicio de una sesión (módulos múltiples) " volver mensaje
Luego defina dos módulos, uno es test_session_scope1.py y otro es test_session_scope2.py
# test_session_scope1.py def test_session_scope1 (session_scope): afirmar session_scope == " 测试 session_scope " # test_session_scope2.py def test_session_scope2 (session_scope): afirmar session_scope == " 测试 session_scope " # 运行 结果 =========== ================== la sesión de prueba comienza ============================= plataforma win32 - Python 3.7.3, pytest-5.1.2, py-1.8.0, pluggy-0.12.0 - D: \ program \ Python37 \ python.exe cachedir: .pytest_cache rootdir: E: \ virtual_workshop \ pytest - demo \ test_demo3 coleccionando ... coleccionado 2 elementos test_session_scope1.py::test_session_scope1 ejecutado PASSED una vez antes de una sesión (módulos múltiples) [ 50% ] test_session_scope2.py::test_session_scope2 PASSED [ 100% ] ========== ==================== 2 aprobado en 0.03s ========================= =====
6. El orden de instanciación
sesión> módulo> clase> función. Un buen ejemplo es de este blog :
import pytest order = [] @ pytest.fixture (scope = " session " ) def s1 (): order.append ( " s1 " ) @ pytest.fixture (scope = " module " ) def m1 (): order.append ( " m1 " ) @ pytest.fixture def f1 (f3, a1): # 先 实例 化 f3, 再 实例 化 a1, 最后 实例 化 f1 order.append ( " f1 " ) afirmar f3 == 123 @ pytest.fixture def f3 (): order.append ( " f3 " ) a = 123 produce a @ pytest.fixture def a1 (): order.append ( " a1 " ) @ pytest.fixture def f2 (): order.append ( " f2 " ) DEF test_order (f1, M1, F2, S1): # M1, S1 después de f1, pero debido a la amplia gama de alcance, será preferentemente instanciado Assert Orden == [ " S1 " " M1 " " F3 " , "a1 " , " f1 " , " f2 " ]