Vai al contenuto

Tempi di prova

La maggior parte dello sviluppo del software non comporta la scrittura di nuovo codice, ma la modifica di quello esistente. Assicurarsi che il codice esistente continui a funzionare nel modo in cui ci aspettiamo è una parte fondamentale del processo di sviluppo del software. Un modo per garantire il comportamento della nostra applicazione è una serie di test.

Esecuzione della suite di test

Si scopre che il nostro progetto ha già una suite di test! Quando abbiamo generato il nostro progetto, sono state generate due directory di primo livello: src e tests. La cartella src contiene il codice della nostra applicazione; la cartella tests contiene la nostra suite di test. All'interno della cartella tests c'è un file chiamato test_app.py con il seguente contenuto:

def test_first():
    """Un primo test per l'app"""
    assert 1 + 1 == 2

Questo è un Pytest caso di test - un blocco di codice che può essere eseguito per verificare un comportamento dell'applicazione. In questo caso, il test è un segnaposto e non verifica nulla della nostra applicazione, ma è un test che possiamo eseguire.

Possiamo eseguire questa suite di test usando l'opzione --test di briefcase dev. Poiché è la prima volta che si eseguono dei test, è necessario inserire anche l'opzione -r per assicurarsi che anche i requisiti dei test siano installati:

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

[helloworld] Installazione dei prerequisiti...
...
Installazione dei prerequisiti di sviluppo... completata

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= inizio sessione di test ==============================
piattaforma 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
raccolta in corso... 1 elemento raccolto

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

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

[helloworld] Installazione dei requisiti...
...
Installazione dei requisiti di sviluppo... completata

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= inizio sessione di test ==============================
piattaforma 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
raccolta in corso... 1 elemento raccolto

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

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

[helloworld] Installazione dei prerequisiti...
...
Installazione dei prerequisiti di sviluppo... completata

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
piattaforma 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
raccolta in corso... 1 elemento raccolto

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

============================== 1 superato in 0,01 s ===============================

Successo! Abbiamo appena eseguito un singolo test che verifica che la matematica di Python funziona nel modo previsto (che sollievo!).

Sostituiamo questo test segnaposto con un test per verificare che il nostro metodo greeting() si comporti come ci aspettiamo. Sostituire il contenuto di test_app.py con il seguente:

da helloworld.app import greeting


def test_name():
    """Se viene fornito un nome, il saluto include il nome"""

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


def test_empty():
    """Se non viene fornito un nome, viene fornito un saluto generico"""

 assert greeting("") == "Ciao, sconosciuto"

Questo definisce due nuovi test, che verificano i due comportamenti che ci aspettiamo di vedere: l'output quando viene fornito un nome e l'output quando il nome è vuoto.

Ora possiamo eseguire nuovamente la suite di test. Questa volta non è necessario fornire l'opzione -r, poiché i requisiti per i test sono già stati installati; è sufficiente usare l'opzione --test:

(beeware-venv) $ briefcase dev --test

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 2 elementi raccolti

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

============================== 2 superati in 0,11 s ===============================
(beeware-venv) $ briefcase dev --test

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 2 elementi raccolti

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

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

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 2 elementi raccolti

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

============================== 2 superati in 0,11 s ===============================

Eccellente! Il nostro metodo di utilità greeting() funziona come previsto.

Sviluppo guidato dai test

Ora che abbiamo una suite di test, possiamo usarla per guidare lo sviluppo di nuove funzionalità. Modifichiamo la nostra applicazione per avere un saluto speciale per un utente in particolare. Possiamo iniziare aggiungendo un caso di test per il nuovo comportamento che vorremmo vedere in fondo a test_app.py:

def test_brutus():
    """Se il nome è Brutus, viene visualizzato un saluto speciale"""

 assert greeting("Brutus") == "Attenzione agli IDE di Python!"

Quindi, eseguire la suite di test con questo nuovo test:

(beeware-venv) $ briefcase dev --test

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

=================================== ERRORI ===================================
_________________________________ test_brutus __________________________________

    def test_brutus():
 """Se il nome è Brutus, viene fornito un saluto speciale"""

> assert greeting("Brutus") == "BeeWare the IDEs of Python!"
E AssertionError: assert 'Hello, Brutus' == 'BeeWare the IDEs of Python!'
E - BeeWare the IDEs of Python!
E + Ciao, Brutus

tests/test_app.py:19: AssertionError
=========================== breve riepilogo dei test ============================
FALLITO tests/test_app.py::test_brutus - AssertionError: assert 'Ciao, Brutus...
========================= 1 fallito, 2 superati in 0,14 s ==========================
(beeware-venv) $ briefcase dev --test

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

=================================== ERRORI ===================================
_________________________________ test_brutus __________________________________

 def test_brutus():
 """Se il nome è Brutus, fornire un saluto speciale"""

> assert greeting("Brutus") == "BeeWare the IDEs of Python!"
E AssertionError: assert 'Hello, Brutus' == 'BeeWare the IDEs of Python!'
E - BeeWare the IDEs of Python!
E + Hello, Brutus

tests/test_app.py:19: AssertionError
=========================== breve riepilogo dei test ============================
FALLITO tests/test_app.py::test_brutus - AssertionError: assert 'Ciao, Brutus...
========================= 1 fallito, 2 superati in 0,14 s ==========================

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

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

=================================== ERRORI ===================================
_________________________________ test_brutus __________________________________

    def test_brutus():
 """Se il nome è Brutus, fornire un saluto speciale"""

> assert greeting("Brutus") == "BeeWare the IDEs of Python!"
E AssertionError: assert 'Hello, Brutus' == 'BeeWare the IDEs of Python!'
E - BeeWare the IDEs of Python!
E + Ciao, Brutus

tests/test_app.py:19: AssertionError
=========================== breve riepilogo dei test ============================
FALLITO tests/test_app.py::test_brutus - AssertionError: assert 'Ciao, Brutus...
========================= 1 fallito, 2 superati in 0,14 s ==========================

Questa volta, vediamo un fallimento del test e l'output spiega la fonte del fallimento: il test si aspetta l'output "BeeWare the IDEs of Python!", ma la nostra implementazione di greeting() restituisce "Hello, Brutus". Modifichiamo l'implementazione di greeting() in src/helloworld/app.py per avere il nuovo comportamento:

def greeting(name):
    if name:
        if name == "Brutus":
            return "Attenzione agli IDE di Python!"
        else:
            return f"Ciao, {name}"
    else:
        return "Ciao, sconosciuto"

Se eseguiamo nuovamente i test, vedremo che i nostri test passano:

(beeware-venv) $ briefcase dev --test

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

============================== 3 superati in 0,15 s ===============================
(beeware-venv) $ briefcase dev --test

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

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

[helloworld] Esecuzione della suite di test nell'ambiente di sviluppo...
===========================================================================
============================= Inizio della sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

============================== 3 superati in 0,15 s ===============================

Test di runtime

Finora abbiamo eseguito i test in modalità di sviluppo. Questo è particolarmente utile quando si sviluppano nuove funzionalità, in quanto si può iterare rapidamente sull'aggiunta di test e sull'aggiunta di codice per far sì che tali test passino. Tuttavia, a un certo punto, si vorrà verificare che il codice venga eseguito correttamente anche nell'ambiente dell'applicazione bundle.

Le opzioni --test e -r possono essere passate anche al comando run. Se si usa briefcase run --test -r, verrà eseguita la stessa suite di test, ma all'interno del bundle dell'applicazione confezionata e non nell'ambiente di sviluppo:

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

[helloworld] Aggiornamento del codice dell'applicazione...
Installazione di src/helloworld... completata
Installazione dei test... completata

[helloworld] Aggiornamento dei requisiti...
...
[helloworld] Creata build/helloworld/macos/app/Hello World.app (modalità test)

[helloworld] Avvio della suite di test...
===========================================================================
Configurazione di Python isolato...
Pre-inizializzazione del runtime 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
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib/lib-dynload
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/app_packages
- /Utenti/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contenuti/Risorse/app
Configurazione di argc/argv...
Inizializzazione del runtime Python...
Installazione del gestore NSLog di Python...
Esecuzione del modulo dell'app: tests.helloworld
---------------------------------------------------------------------------
============================= inizio sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

============================== 3 superati in 0,21 s ===============================

[helloworld] Suite di test superata!
(beeware-venv) $ briefcase run --test -r

[helloworld] Completamento della configurazione dell'applicazione...
Selezione della piattaforma ubuntu:jammy (base Debian del fornitore)
Rilevamento della versione di glibc... fatto
Selezione di glibc 2.35
Selezione di Python 3.10

[helloworld] Aggiornamento del codice dell'applicazione...
Installazione di src/helloworld... completata
Installazione dei test... completata

[helloworld] Aggiornamento dei requisiti...
...
[helloworld] Compilato build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld (modalità test)

[helloworld] Avvio della suite di test...
===========================================================================
============================= inizio sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

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

[helloworld] Aggiornamento del codice dell'applicazione...
Installazione di src/helloworld... completata
Installazione dei test... completata

[helloworld] Aggiornamento dei requisiti...
...
[helloworld] Creato build\helloworld\windows\app\src\Hello World.exe (modalità test)

===========================================================================
Log avviato: 2022-12-02 10:57:34Z
Preinizializzazione del runtime 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
Configurazione di argc/argv...
Inizializzazione del runtime Python...
Esecuzione del modulo dell'app: tests.helloworld
---------------------------------------------------------------------------
============================= inizio sessione di test ==============================
...
raccolta in corso... 3 elementi raccolti

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

============================== 3 superati in 0,21 s ===============================

Come per briefcase dev --test, l'opzione -r è necessaria solo la prima volta che si esegue la suite di test, per assicurarsi che le dipendenze del test siano presenti. Nelle esecuzioni successive, si può omettere questa opzione.

Si può anche usare l'opzione --test sui backend mobili: - quindi briefcase run iOS --test e briefcase run android --test funzioneranno entrambi, eseguendo la suite di test sul dispositivo mobile selezionato.