¿Puedo realizar múltiples aserciones en pytest?

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