Estoy usando pytest para mis pruebas de selenium y quería saber si es posible tener múltiples afirmaciones en una sola prueba.
Llamo a una función que compara valores múltiples y quiero que la prueba informe sobre todos los valores que no coinciden. El problema que tengo es que usar “assert” o “pytest.fail” detiene la prueba tan pronto como encuentra un valor que no coincide.
¿Hay alguna manera de hacer que la prueba continúe ejecutándose e informar sobre todos los valores que no coincidan?
Como comentó Jon Clements, puede completar una lista de mensajes de error y luego afirmar que la lista está vacía, mostrando cada mensaje cuando la afirmación es falsa.
En concreto, podría ser algo así:
def test_something(self): errors = [] # replace assertions by conditions if not condition_1: errors.append("an error message") if not condition_2: errors.append("an other error message") # assert no error message has been registered, else print messages assert not errors, "errors occured:\n{}".format("\n".join(errors))
Las aserciones originales se reemplazan por if
no se if
declaraciones que agregan mensajes a una lista de errors
en caso de que se cumpla la condición. Luego afirma que la lista de errors
está vacía (una lista vacía es falsa) y hace que el mensaje de afirmación contenga cada mensaje de la lista de errors
.
También puede hacer un generador de prueba como se describe en la documentación de la nariz . No encontré ningún documento pytest que lo describiera, pero sé que pytest manejó esto exactamente de la misma manera que la nariz.
pytest-assume es “un complemento de pytest que permite múltiples fallas por prueba” . Aquí hay un ejemplo de cómo lo usarías (tomado de README
):
import pytest @pytest.mark.parametrize(('x', 'y'), [(1, 1), (1, 0), (0, 1)]) def test_simple_assume(x, y): pytest.assume(x == y) pytest.assume(True) pytest.assume(False)
Aunque algunas de las afirmaciones fallan, todas son evaluadas y reportadas:
======================================== FAILURES ========================================= _________________________________ test_simple_assume[1-1] _________________________________ > pytest.assume(False) test_assume.py:7 y = 1 x = 1 ---------------------------------------- Failed Assumptions:1 _________________________________ test_simple_assume[1-0] _________________________________ > pytest.assume(x == y) test_assume.py:5 y = 0 x = 1 > pytest.assume(False) test_assume.py:7 y = 0 x = 1 ---------------------------------------- Failed Assumptions:2 _________________________________ test_simple_assume[0-1] _________________________________ > pytest.assume(x == y) test_assume.py:5 y = 1 x = 0 > pytest.assume(False) test_assume.py:7 y = 1 x = 0 ---------------------------------------- Failed Assumptions:2 ================================ 3 failed in 0.02 seconds =================================
Aquí hay un enfoque alternativo llamado Demora demorada, Es bastante similar a lo que @Trofph ha proporcionado, y ofrece un mejor seguimiento de la stack.
El paquete delay-assert en PyPI implementa este enfoque. Vea también el repository pr4bh4sh / python-delayed-assert en GitHub, o instale desde PyPI usando:
pip install delayed-assert