alcance del accesorio - pytest

Este artículo registra principalmente: el alcance de diferentes parámetros de fixture en pytest

1. Los parámetros del dispositivo controlan el alcance de la acción.
Hay un parámetro de alcance en el dispositivo que puede controlar el alcance del dispositivo: sesión > módulo > clase > función

fixture(scope="function", params=None, autouse=False, ids=None, name=None):
    """使用装饰器标记fixture的功能
 可以使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称可以在以后使用
 引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。 
 测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。

:arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".

:arg params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它

:arg autouse:  如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture

:arg ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成

:arg name:   fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名
                   “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')“”。

2. Explicación detallada de los parámetros de socope

  1. El parámetro de alcance es: función

Ámbito de acción: cada función o método será llamado

class Cada clase se llama una vez, una clase puede tener varios
módulos de método y cada archivo .py se llama una vez, y hay varias funciones y
sesiones de clase en este archivo, que se llaman una vez por varios archivos y se pueden llamar a través de . py. Un archivo .py es module
scope="function"
@pytest.fixture() Si no escribe parámetros, el valor predeterminado es scope="function". Su alcance de acción es ejecutarse una vez antes de cada caso de prueba, y el código de destrucción se ejecuta en el caso de prueba que se ejecuta después de eso.

  • demostración de código:
import pytest

@pytest.fixture()
def first():
    print("\n获取用户名")
    a = "yoyo"
    return a

@pytest.fixture(scope="function")
def sencond():
    print("\n获取密码")
    b = "123456"
    return b

def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" %first)
    assert first == "yoyo"

def test_2(sencond):
    '''用例传fixture'''
    print("测试密码:%s" %sencond)
    assert sencond == "123456"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture7.py"])

  • resultado de la operación:
============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture7.py 
获取用户名
测试账号:yoyo
.
获取密码
测试密码:123456
.

========================== 2 passed in 0.01 seconds ==========================

Además: el caso de uso también se coloca en la clase.

  • demostración de código:

import pytest

@pytest.fixture()
def first():
    print("\n获取用户名")
    a = "yoyo"
    return a

@pytest.fixture(scope="function")
def sencond():
    print("\n获取密码")
    b = "123456"
    return b

class TestCase():
    def test_1(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "yoyo"

    def test_2(self, sencond):
        '''用例传fixture'''
        print("测试密码:%s" % sencond)
        assert sencond == "123456"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture7.py"])
scope="class"
  1. El parámetro de alcance es clase.

Cuando el accesorio está en el nivel de clase, si hay múltiples casos de uso en una clase, y se llama a este accesorio, entonces este accesorio solo se ejecuta una vez antes de que comiencen todos los casos de uso en la clase

  • demostración de código:

import pytest

@pytest.fixture(scope="class")
def first():
    print("\n获取用户名,scope为class级别只运行一次")
    a = "yoyo"
    return a

class TestCase():
    def test_1(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "yoyo"

    def test_2(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture9.py"])
  • resultado de la operación:
============================= test session starts ============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture9.py 
获取用户名,scope为class级别只运行一次
测试账号:yoyo
.测试账号:yoyo
.

========================== 2 passed in 0.13 seconds ==========================
  1. El parámetro de alcance es: módulo

scope = "módulo"
Cuando el dispositivo está en el nivel del módulo, solo se ejecuta una vez antes de que comiencen todos los casos de uso en el script .py actual

  • demostración de código:
import pytest

@pytest.fixture(scope="module")
def first():
    print("\n获取用户名,scope为module级别当前.py模块只运行一次")
    a = "yoyo"
    return a


def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "yoyo"

class TestCase():
    def test_2(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture10.py"])
  • resultado de la operación:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture10.py 
获取用户名,scope为module级别当前.py模块只运行一次
测试账号:yoyo
.测试账号:yoyo
.

========================== 2 passed in 0.14 seconds ===========================
  1. El parámetro de ámbito es: sesión

El dispositivo scope="session"
se puede llamar a través de los módulos .py en el nivel de sesión, es decir, cuando tenemos múltiples casos de uso de archivos .py, si varios casos de uso solo necesitan llamar al dispositivo una vez, entonces se puede configurar para alcance = "sesión", y escribe en el archivo conftest.py

El nombre del archivo conftest.py es fijo y pytest reconocerá automáticamente el archivo. Si lo coloca en el directorio raíz del proyecto, puede llamarlo globalmente, si lo coloca en un paquete determinado, solo será válido en ese paquete.

  • demostración de código:

(1) concurso.py

import pytest

@pytest.fixture(scope="session")
def first():
    print("\n获取用户名,scope为session级别多个.py模块只运行一次")
    a = "yoyo"
    return a
test_fixture11.py和test_fixture12.py用例脚本

(2) prueba_fixture11.py

import pytest
def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture11.py"])

(3) test_fixture12.py

import pytest

def test_2(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture12.py"])
如果想同时运行test_fixture11.py和test_fixture12.py,在cmd执行

(4) Ejecute el comando:pytest -s test_fixture11.py test_fixture12.py

  • Resultados de la:
============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture11.py .                                                      [ 50%]
test_fixture12.py .                                                      [100%]

========================== 2 passed in 0.03 seconds ===========================

D:\YOYO\fixt>pytest -s test_fixture11.py test_fixture12.py
============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture11.py
获取用户名,scope为session级别多个.py模块只运行一次
测试账号:yoyo
.
test_fixture12.py 测试账号:yoyo
.

========================== 2 passed in 0.03 seconds ===========================

Supongo que te gusta

Origin blog.csdn.net/Orange_hhh/article/details/128084191
Recomendado
Clasificación