Configurar un conjunto de pruebas para su código puede parecer un obstáculo para el que no está preparado, pero esta biblioteca requiere mucho esfuerzo.

Las pruebas son una parte esencial del desarrollo de software. Ayuda a detectar errores temprano y reduce la probabilidad de errores en el futuro.

Pytest es uno de los marcos de prueba más populares para Python. Le permite escribir pruebas pequeñas y legibles que pueden escalar a medida que crece su aplicación. Aprenda a configurar y usar Pytest con su código de Python.

Configuración de Pytest

Antes de instalar Pytest, es mejor crear un entorno virtual para aislar su entorno de prueba, de modo que pueda evitar conflictos con otros paquetes y dependencias.

Para crear un entorno virtual, ejecute el siguiente comando antes de instalar Pytest.

python -m venv pruebas

Esto creará un nuevo entorno virtual llamado tests en su directorio actual. Para activar el entorno, ejecute este comando si está en Linux o Mac:

pruebas de fuente/bin/activar

Para Windows, ejecute este comando:

instagram viewer
pruebas\\Scripts\\activar

Para instalar Pytest, puede usar pip, el administrador de paquetes de Python, con este comando en su terminal:

pip instalar pytest

Si no tienes a Pip, no te preocupes; puede instalar Pip en Windows, Mac y Linux.

Ejecute el siguiente comando para verificar si instaló Pytest correctamente.

pytest --versión

Esto debería devolver el número de versión instalada.

Creando tu primera prueba

Considere la siguiente función que suma dos números y devuelve el resultado.

definitivamenteañadir_números(a, b):
devolver a + b

Varias cosas podrían salir mal con esta función. Por ejemplo, considere lo que sucede si llama a la función con valores no numéricos como Ninguno o un valor de tipo cadena. Estos son algunos de los posibles casos extremos que pueden hacer que la función falle.

Una de las primeras pruebas que escriba debe comprobar si la función devuelve el resultado esperado. Para hacer esto, puede usar la palabra clave assert para comparar el resultado real de la función con el resultado esperado. En el caso de la función add_numbers, la función de prueba podría verse así:

definitivamentetest_add_numbers():
afirmar agregar_numeros(2, 3) == 5
afirmar agregar_numeros(-1, 1) == 0
afirmar agregar_numeros(0, 0) == 0

Esta función de prueba incluye tres afirmaciones, cada una de las cuales compara la salida de la función add_numbers con un valor esperado. La primera prueba verifica que sumar 2 y 3 devuelve 5, la segunda prueba verifica que sumar -1 y 1 devuelve 0, y la tercera prueba verifica que sumar 0 y 0 devuelve 0.

Cómo ejecutar pruebas con Pytest

Después de haber escrito sus pruebas, el siguiente paso es ejecutarlas. Para hacer esto con Pytest, navegue hasta el directorio que contiene su archivo de prueba y ejecute el comando pytest:

pytest

Si todo funciona como se esperaba, verá un mensaje que indica que todas las pruebas pasaron con éxito. Sin embargo, si alguna de las afirmaciones falla, Pytest informará un error y le mostrará los valores de entrada que causaron la falla.

Por ejemplo, supongamos que ejecutó la siguiente función de prueba para la función add_numbers:

definitivamentetest_add_numbers():
afirmar agregar_numeros(2, 3) == 6
afirmar agregar_numeros(-1, 1) == 0
afirmar agregar_numeros(0, 0) == 0

La primera afirmación fallará porque el valor esperado era 6, pero el valor real era 5 (la suma de 2 y 3). Pytest devolverá el siguiente mensaje:

Este mensaje le muestra los valores de entrada que causaron el valor y también le dice cuál debería ser el valor real. Esto facilita la identificación y corrección rápida de errores en su código.

Uso de Pytest.raises para afirmar excepciones

Ahora, escribamos una prueba para cubrir uno de los casos extremos de la función add_numbers. Cuando pasa un argumento no numérico como Ninguno a la función, Python debería generar una excepción TypeError.

ya deberías estar manejo de excepciones en sus programas de Python, y puede probar que su código también los genera correctamente.

Para hacer esto, copie la siguiente función de prueba en su archivo. Utiliza el administrador de contexto pytest.raises para verificar si llamar a la función add_number con "Ninguno" genera una excepción TypeError.

importar pytest

definitivamentetest_add_numbers_with_invalid_inputs():
con pytest.raises (TypeError):
agregar_numeros(Ninguno, 2)

Luego ejecute Pytest desde la línea de comando. Si no se genera la excepción, la prueba fallará.

Puede ir más allá y verificar los detalles del mensaje de excepción. El administrador de contexto produce un objeto ExceptionInfo con los detalles.

Por ejemplo, en esta función de prueba, afirma el mensaje de excepción de esta manera:

definitivamentetest_add_numbers_with_invalid_inputs():
con pytest.raises(Error de tecleado) como exc_info:
agregar_numeros(Ninguno, 2)

afirmar exc_info.valor.args[0] == "tipo(s) de operando no admitido(s) para +: 'NoneType' e 'int'"

Si el mensaje no coincide con el de la prueba, Pytest indicará una falla.

Cómo usar pruebas parametrizadas para probar múltiples entradas a la vez

En lugar de llamar manualmente a una función con múltiples entradas como esta:

definitivamentetest_add_numbers():
afirmar agregar_numeros(2, 3) == 6
afirmar agregar_numeros(-1, 1) == 0
afirmar agregar_numeros(0, 0) == 0

Pytest proporciona una función de prueba parametrizada que le permite hacer lo mismo más fácilmente. Así es como puede reescribir la función de prueba anterior:

importar pytest

@pytest.marcar.parametrizar("a, b, esperado", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
definitivamentetest_add_numbers(a, b, esperado):
afirmarañadir_números(a, b)== esperado

Cómo ejecutar varias pruebas

Hasta ahora, solo ha escrito dos pruebas para la función add_numbers. Para funciones más complejas con más pruebas, es posible que desee agruparlas en una clase.

Por ejemplo, así es como crearía una clase de prueba para la función de agregar.

clasePruebaAñadirFunción:
@pytest.mark.parametrize("a, b, esperado", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
definitivamenteprueba_adición_con_números(yo, a, b, esperado):
afirmar add_numbers (a, b) == esperado

definitivamentetest_add_numbers_with_invalid_inputs(ser):
con pytest.raises (TypeError) como exc_info:
agregar_numeros(Ninguno, 2)
afirmar exc_info.valor.args[0] == "tipo(s) de operando no admitido(s) para +: 'NoneType' e 'int'"

Tenga en cuenta que debe anteponer el nombre de la clase con "Prueba" para que Pytest pueda identificarla como una clase de prueba y ejecutarla.

Pytest tiene muchas más características

Usando Pytest, puede verificar automáticamente que su código funcione como espera. Pytest ofrece muchas otras funciones, como accesorios que le permiten configurar y eliminar datos de prueba y marcas para configurar metadatos en sus funciones de prueba.

Además, puede integrar Pytest en su tubería de CI y comenzar a ejecutar pruebas de forma automática y continua cuando cambia su código.