Saltar a contenido

Veces de pruebas

La mayor parte del desarrollo de software no consiste en escribir código nuevo, sino en modificar el existente. Garantizar que el código existente sigue funcionando de la forma que esperamos es una parte clave del proceso de desarrollo de software. Una forma de asegurar el comportamiento de nuestra aplicación es con un conjunto de pruebas.

Ejecución del conjunto de pruebas

¡Resulta que nuestro proyecto ya tiene un conjunto de pruebas! Cuando originalmente generamos nuestro proyecto, se generaron dos directorios de nivel superior: src y tests. La carpeta src contiene el código de nuestra aplicación; la carpeta tests contiene nuestro conjunto de pruebas. Dentro de la carpeta tests hay un archivo llamado test_app.py con el siguiente contenido:

def test_first():
    """Una prueba inicial para la aplicación"""
    assert 1 + 1 == 2

Esto es un Pytest caso de prueba — un bloque de código que puede ser ejecutado para verificar algún comportamiento de tu aplicación. En este caso, la prueba es un marcador de posición, y no verifica nada específico sobre nuestra aplicación, pero es una prueba que podemos realizar.

Podemos ejecutar este conjunto de pruebas utilizando la opción --test de briefcase dev. Como es la primera vez que ejecutamos pruebas, también necesitamos pasar la opción -r para asegurarnos de que también se instalan los requisitos de las pruebas:

(beeware-venv) $ briefcase dev --test -r

[helloworld] Instalando requisitos...
...
Instalando requisitos de desarrollo... hecho

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
======================================================================
===================== Comienza la sesión de pruebas =======================
plataforma darwin -- Python 3.11.0, pytest-7.2.0, pluggy-1.0.0 -- /Users/brutus/beeware-tutorial/beeware-venv/bin/python3.11
cachedir: /var/folders/b_/khqk71xd45d049kxc_59ltp80000gn/T/.pytest_cache
rootdir: /Users/brutus
plugins: anyio-3.6.2
recopilando... 1 elemento recopilado

tests/test_app.py::test_first APROBADO [100%]

============================== 1 aprobado en 0,01 s ======================
(beeware-venv) $ briefcase dev --test -r

[helloworld] Instalando requisitos...
...
Instalando requisitos de desarrollo... hecho

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
=====================================================================
========================= inicio de la sesión de pruebas ==================
plataforma linux -- Python 3.11.0
pytest==7.2.0
py==1.11.0
pluggy==1.0.0
cachedir: /tmp/.pytest_cache
rootdir: /home/brutus
plugins: anyio-3.6.2
recopilando... 1 elemento recopilado

tests/test_app.py::test_first APROBADO [100%]

============================== 1 aprobado en 0,01 s =========================
(beeware-venv) C:\...>briefcase dev --test -r

[helloworld] Instalando requisitos...
...
Instalando requisitos de desarrollo... hecho

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
==========================================================================
========================== Inicio de la sesión de pruebas =======================
plataforma win32 -- Python 3.11.0
pytest==7.2.0
py==1.11.0
pluggy==1.0.0
cachedir: C:\Users\brutus\AppData\Local\Temp\.pytest_cache
rootdir: C:\Users\brutus
plugins: anyio-3.6.2
recopilando... 1 elemento recopilado

tests/test_app.py::test_first APROBADO [100%]

=========================== 1 aprobado en 0,01 s ===========================

¡Un éxito! Acabamos de ejecutar una única prueba que verifica que las matemáticas de Python funcionan como esperábamos (¡Qué alivio!).

Vamos a reemplazar esta prueba de marcador de posición con una prueba para verificar que nuestro método greeting() se comporta como esperamos. Sustituye el contenido de test_app.py por el siguiente:

from helloworld.app import greeting


def test_name():
    """Si se proporciona un nombre, el saludo incluye dicho nombre"""

 assert greeting("Alice") == "Hola, Alice"


def test_empty():
    """Si no se proporciona un nombre, se muestra un saludo genérico"""

 assert greeting("") == "Hola, desconocido"

Esto define dos nuevos casos de pruebas, verificando los dos comportamientos que esperamos ver: la salida cuando se proporciona un nombre, y la salida cuando el nombre está vacío.

Ahora podemos volver a ejecutar el conjunto de pruebas. Esta vez, no necesitamos proporcionar la opción -r, ya que los requisitos de la prueba ya se han instalado; sólo tenemos que utilizar la opción --test:

(beeware-venv) $ briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
======================== Comienza la sesión de pruebas ========================
...
Recopilando... 2 elementos recopilados

tests/test_app.py::test_name APROBADO [ 50%]
tests/test_app.py::test_empty APROBADO [100%]

============================== 2 aprobados en 0,11 s ===============================
(beeware-venv) $ briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
======================== Comienza la sesión de pruebas ========================
...
Recopilando... 2 elementos recopilados

tests/test_app.py::test_name APROBADO [ 50%]
tests/test_app.py::test_empty APROBADO [100%]

============================== 2 aprobados en 0,11 s ===============================
(beeware-venv) C:\...>briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
========================= Comienza la sesión de pruebas =======================
...
Recopilando... 2 elementos recopilados

tests/test_app.py::test_name APROBADO [ 50%]
tests/test_app.py::test_empty APROBADO [100%]

============================== 2 aprobados en 0,11 s ==========================

Excelente Nuestro método de utilidad greeting() está funcionando como se esperaba.

Desarrollo basado en pruebas

Ahora que tenemos un conjunto de pruebas, podemos utilizarlo para dirigir el desarrollo de prestaciones nuevas. Vamos a modificar nuestra aplicación para tener un saludo especial para un usuario en particular. Podemos empezar por añadir un caso de prueba para el comportamiento nuevo que nos gustaría ver en la parte inferior de test_app.py:

def test_brutus():
    """Si el nombre es Brutus, se muestra un saludo especial"""

 assert greeting("Brutus") == "¡Cuidado con los IDE de Python!"

A continuación, ejecute el conjunto de pruebas con esta prueba nueva:

(beeware-venv) $ briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
======================== Comienza la sesión de pruebas ========================
...
recopilando... se han recopilado 3 elementos

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66%]
tests/test_app.py::test_brutus FALLIDO [100%]

=================================== FALLOS ================================
_________________________________ test_brutus ______________________________

    def test_brutus():
 """Si el nombre es Brutus, se muestra un saludo especial"""

> assert greeting("Brutus") == "¡Cuidado con los IDE de Python!"
E AssertionError: assert 'Hola, Brutus' == '¡Cuidado con los IDE de Python!'
E - ¡Cuidado con los IDE de Python!
E + Hola, Brutus

tests/test_app.py:19: AssertionError
=========================== Breve resumen de la prueba =====================
FALLÓ tests/test_app.py::test_brutus - AssertionError: assert 'Hola, Brutus...
============================= 1 falló, 2 pasaron en 0,14 s ======================
(beeware-venv) $ briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
=======================================================================
======================= Comienza la sesión de pruebas =====================
...
Recopilando... 3 elementos recopilados

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66%]
tests/test_app.py::test_brutus FALLIDO [100%]

================================= FALLOS ===============================
_________________________________ test_brutus ___________________________

 def test_brutus():
 """Si el nombre es Brutus, proporciona un saludo especial"""

> assert greeting("Brutus") == "¡Cuidado con los IDE de Python!"
E AssertionError: assert 'Hello, Brutus' == '¡Cuidado con los IDE de Python!'
E - ¡Cuidado con los IDE de Python!
E + Hello, Brutus

tests/test_app.py:19: AssertionError
=========================== breve resumen de la prueba =====================
FALLÓ tests/test_app.py::test_brutus - AssertionError: assert 'Hola, Brutus...
========================= 1 falló, 2 pasaron en 0,14 s ========================

============================== 2 pasaron en 0,11 s =========================
(beeware-venv) C:\...>briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
======================== Inicio de la sesión de pruebas =========================
...
recopilando... 3 elementos recopilados

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66%]
tests/test_app.py::test_brutus FALLIDO [100%]

================================ FALLOS =================================
______________________________ test_brutus _______________________________

    def test_brutus():
 """Si el nombre es Brutus, muestra un saludo especial"""

> assert greeting("Brutus") == "¡Cuidado con los IDE de Python!"
E AssertionError: assert 'Hola, Brutus' == '¡Cuidado con los IDE de Python!'
E - ¡Cuidado con los IDE de Python!
E + Hola, Brutus

tests/test_app.py:19: AssertionError
====================== Breve resumen de la prueba ========================
FALLÓ tests/test_app.py::test_brutus - AssertionError: assert 'Hola, Brutus...
========================= 1 falló, 2 pasaron en 0,14 s ========================

Esta vez, vemos un fallo en el test; y la salida explica el origen del fallo: el test está esperando la salida “¡BeeWare los IDE de Python!”, pero nuestra implementación de greeting() está devolviendo “Hola, Brutus”. Modifiquemos la implementación de greeting() en src/helloworld/app.py para que tenga el comportamiento nuevo:

def greeting(name):
    if name:
    if name == "Brutus":
        return "¡Cuidado con los IDE de Python!"
    else:
        return f"Hola, {name}"
    else:
        return "Hola, desconocido"

Si ejecutamos las pruebas de nuevo, ahora veremos que nuestras pruebas pasan:

(beeware-venv) $ briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
======================== Comienza la sesión de pruebas ========================
...
recopilando... se han recopilado 3 elementos

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66 %]
tests/test_app.py::test_brutus APROBADO [100 %]

=========================== 3 aprobadas en 0,15 s =============================
(beeware-venv) $ briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
======================== Comienza la sesión de pruebas ========================
...
recopilando... se han recopilado 3 elementos

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66 %]
tests/test_app.py::test_brutus APROBADO [100 %]

=========================== 3 aprobadas en 0,15 s =============================
(beeware-venv) C:\...>briefcase dev --test

[helloworld] Ejecutando el conjunto de pruebas en el entorno de desarrollo...
===========================================================================
======================== Inicio de la sesión de pruebas =========================
...
recopilando... 3 elementos recopilados

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66 %]
tests/test_app.py::test_brutus APROBADO [100 %]

================================ 3 aprobadas en 0,15 s ========================

Pruebas en tiempo de ejecución

Hasta ahora, hemos estado ejecutando las pruebas en modo de desarrollo. Esto es especialmente útil cuando estás desarrollando prestaciones nuevas, ya que puedes iterar rápidamente en la adición de pruebas, y la adición de código para hacer que esas pruebas aprueben. Sin embargo, en algún momento, querrás verificar que su código también se ejecuta correctamente cuando se encuentra dentro del entorno de la aplicación empaquetada.

Las opciones --test y -r también se pueden pasar al comando run. Si utilizas briefcase run --test -r, se ejecutará el mismo conjunto de pruebas, pero se ejecutará dentro del paquete de aplicaciones empaquetado en lugar de en tu entorno de desarrollo:

(beeware-venv) $ briefcase run --test -r

[helloworld] Actualizando el código de la aplicación...
Instalando src/helloworld... hecho
Instalando pruebas... hecho

[helloworld] Actualizando requisitos...
...
[helloworld] Compilado build/helloworld/macos/app/Hello World.app (modo de prueba)

[helloworld] Iniciando conjunto de pruebas...
===========================================================================
Configurando Python aislado...
Preinicializando el tiempo de ejecución de Python...
PythonHome: /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib
PYTHONPATH:
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python311.zip
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib
- /Usuarios/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib/lib-dynload
- /Usuarios/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/app_packages
- /Usuarios/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contenido/Recursos/app
Configurando argc/argv...
Inicializando el tiempo de ejecución de Python...
Instalando el controlador NSLog de Python...
Ejecutando el módulo de la aplicación: tests.helloworld
---------------------------------------------------------------------------
========================= Comienza la sesión de pruebas =======================
...
recopilando... 3 elementos recopilados

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66%]
tests/test_app.py::test_brutus APROBADO [100%]

============================ 3 superadas en 0,21 s =============================

[helloworld] ¡Conjunto de pruebas superado!
(beeware-venv) $ briefcase run --test -r

[helloworld] Finalizando la configuración de la aplicación...
Seleccionando ubuntu:jammy (base Debian del proveedor)
Determinando la versión de glibc... hecho
Seleccionando glibc 2.35
Seleccionando Python 3.10

[helloworld] Actualizando el código de la aplicación...
Instalando src/helloworld... hecho
Instalando pruebas... hecho

[helloworld] Actualizando requisitos...
...
[helloworld] Compilado build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld (modo de prueba)

[helloworld] Iniciando el conjunto de pruebas...
===========================================================================
======================== inicio de la sesión de pruebas =========================
...
recopilando... recopilados 3 elementos

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66%]
tests/test_app.py::test_brutus APROBADO [100%]

============================ 3 aprobados en 0,21 s =============================
(beeware-venv) C:\...>briefcase run --test -r

[helloworld] Actualizando el código de la aplicación...
Instalando src/helloworld... hecho
Instalando pruebas... hecho

[helloworld] Actualizando requisitos...
...
[helloworld] Compilado build\helloworld\windows\app\src\Hello World.exe (modo de prueba)

===========================================================================
Registro iniciado: 2022-12-02 10:57:34Z
Preinicializando el tiempo de ejecución de Python...
PythonHome: C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src
PYTHONPATH:
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\python311.zip
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app_packages
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app
Configurando argc/argv...
Inicializando el tiempo de ejecución de Python...
Ejecutando el módulo de la aplicación: tests.helloworld
---------------------------------------------------------------------------
 ======================= Comienza la sesión de pruebas ========================
...
recopilando... 3 elementos recopilados

tests/test_app.py::test_name APROBADO [ 33%]
tests/test_app.py::test_empty APROBADO [ 66%]
tests/test_app.py::test_brutus APROBADO [100%]

=========================== 3 aprobados en 0,21 s ==============================

Al igual que con briefcase dev --test, la opción -r sólo es necesaria la primera vez que se ejecuta el conjunto de pruebas para asegurarse que las dependencias están presentes. En las subsecuentes ejecuciones, puede omitir esta opción.

También puedes utilizar la opción --test en móviles en segundo plano: - así briefcase run iOS --test y briefcase run android --test ambos funcionarán , ejecutando el conjunto de pruebas en el dispositivo móvil que selecciones.