¿Cuál es la ventaja de un accesorio de alcance de función (predeterminado) sin código de desmontaje? ¿Por qué no simplemente llamar a la función al comienzo de la prueba?
Por ejemplo, ¿cuál es el beneficio de escribir:
@pytest.fixture def smtp(): return smtplib.SMTP("smtp.gmail.com") def test_ehlo(smtp): response, msg = smtp.ehlo() # ...en lugar de simplemente:
def create_smtp(): return smtplib.SMTP("smtp.gmail.com") def test_ehlo(): smtp = create_smtp() response, msg = smtp.ehlo() # ...Entiendo por qué los accesorios son útiles cuando necesitamos un código de desmontaje. También entiendo por qué son útiles los accesorios con un alcance que no sea la función: es posible que queramos reutilizar el mismo objeto "externo" en múltiples pruebas (para ahorrar el tiempo que lleva crearlo; o tal vez incluso para mantener su estado, aunque eso parece ser bastante peligroso ya que esto crea un acoplamiento difícil de ver entre pruebas separadas).
Tuve una pregunta similar cuando comencé a usarlo. Aquí está mi experiencia:
¿Cuál es la ventaja de un accesorio de alcance de función (predeterminado) sin código de desmontaje? ¿Por qué no simplemente llamar a la función al comienzo de la prueba?
Ahorro de espacio vertical.
Considere algo como esto, donde tiene más de un accesorio por prueba:
import pytest @pytest.fixture def value1(): return 1 @pytest.fixture def value2(): return 2 @pytest.fixture def value3(): return 3 def test_values(value1, value2, value3): assert value1 == 1 assert value2 == 2 assert value3 == 3Si hiciéramos esto a tu manera:
def test_values(): v1 = value1() v2 = value2() v3 = value3() assert v1 == 1 assert v2 == 2 assert v3 == 3 Son tres líneas extra de código. No es gran cosa, pero ¿qué pasaría si tuviera 10 pruebas que necesitaran value1 , value2 y value3 ? Ahora tiene 30 líneas adicionales de espacio vertical básicamente sin razón.
Obviamente, nuestros dos ejemplos están demasiado simplificados (podría haber hecho la llamada y assert en línea), pero creo que es sencillo ver cómo esto podría tener un impacto con el código real.
Creo que una de las ventajas más importantes de los accesorios con ámbito de función es la consistencia. Es mucho más legible y lógico si todos sus dispositivos (sin importar el alcance o el código de desmontaje) se usan exactamente de la misma manera.
Además, si en algún momento en el futuro decide cambiar el alcance de este dispositivo o agregarle un código de desmontaje, entonces no necesitará cambiar ningún caso de prueba, solo el código del dispositivo.