Tengo las siguientes pruebas:

@pytest.mark.parametrize(
    "nums",
    [[3, 1, 5, 4, 2], [2, 6, 4, 3, 1, 5], [1, 5, 6, 4, 3, 2]]
)
def test_cyclic_sort(nums):
    pass


@pytest.mark.parametrize(
    "nums, missing",
    [([4, 0, 3, 1], 2)]
)
def test_find_missing_number(nums, missing):
    pass

Me gustaría personalizar los nombres de las pruebas para incluir la matriz de entrada. Leí los pytest docs < / a> y esta pregunta y esta pregunta, pero ninguna responde las siguientes preguntas:

  1. ¿Qué se pasa a la función id? En mi código anterior, la primera prueba toma un parámetro, la segunda toma dos.
  2. pytest docs usa una función de nivel superior para id, mientras que me gustaría poner mis pruebas en una clase y usar un @staticmethod. Intentar hacer referencia al método estático con TestClass.static_method desde dentro de TestClass da un error en PyCharm; ¿Cuál es la sintaxis correcta para hacer esto?

Editar: Creado https://github.com/pytest-dev/pytest/issues/8448.

1
Abhijit Sarkar 15 mar. 2021 a las 05:18

1 respuesta

La mejor respuesta

Cuando se usa un invocable para la palabra clave ids, se llamará con un solo argumento: el valor del parámetro de prueba que se parametriza. El ids invocable devuelve una cadena, que se utilizará entre corchetes como sufijo del nombre de la prueba.

Si la prueba se parametriza sobre varios valores, la función aún se llamará con un solo argumento, pero se llamará varias veces por prueba. El nombre generado se unirá con guiones, algo así como

"-".join([idfunc(val) for val in parameters])

Por ejemplo:

test_something[val1-val2-val3]

Aquí está la combinación en la fuente de Pytest..

Para usar un método estático, esta sintaxis funciona:

class TestExample:

    @staticmethod
    def idfunc(val):
        return f"foo{val}"

    @pytest.mark.parametrize(
        "x, y",
        [
            [1, 2],
            ["a", "b"],
        ],
        ids=idfunc.__func__,
    )
    def test_vals(self, x, y):
        assert x
        assert y

Esto generará dos pruebas, llamando a idfunc cuatro veces como se describe arriba.

TestExample::test_vals[foo1-foo2]
TestExample::test_vals[fooa-foob]
1
wim 15 mar. 2021 a las 03:11