I migliori test framework per Python

Il test non è il momento preferito di uno sviluppatore di software. La parte divertente è scrivere il codice; chi vuole saltare attraverso i cerchi che ti dicono quanto poco funziona? Tuttavia, è una pratica obbligatoria per una buona programmazione. Aiuterà a prevenire i bug che potrebbero influenzare le prestazioni del tuo codice, renderlo meno utilizzabile o, peggio ancora, consentire agli aggressori informatici di entrare dalla porta sul retro.

Integrare i test nella tua programmazione dall’inizio rende più facile e meno dispendioso in termini di tempo correggere i bug, ma come si fa? Per gli sviluppatori Python, il linguaggio viene fornito con un proprio framework di test chiamato Unittest, ma ci sono anche framework di test di terze parti che mirano a migliorare l’originale. Eccone alcuni.

Questi strumenti di test non sono utili solo da soli. Puoi usarne alcuni in combinazione tra loro. Ad esempio, Selenium è utile per testare le interazioni degli utenti, ma è più potente se utilizzato con altri framework. Poiché utilizza Python, puoi parametrizzare Selenium chiamandolo dalle tue funzioni PyTest. Puoi anche trasformarlo in uno sviluppo basato sul comportamento chiamando Selenium dal file dei passaggi della tua sessione di comportamento.

Indipendentemente dal fatto che tu stia utilizzando unit test, test comportamentali o entrambi, l’integrazione di questi test nel processo di codifica può aiutare ad aumentare la qualità del tuo prodotto finale.

Unittest (PyUnit)

Essendo il modulo di test integrato in Python, il principale vantaggio di Unittest è che non è necessario installare nient’altro per usarlo immediatamente. Gestisce il test delle unità (come probabilmente puoi immaginare), che garantisce che una funzione software produca l’output corretto, anche quando viene presentato con input insoliti.

Questo strumento di test richiede la creazione di una classe che contenga i test sottoclasse della sua classe TestCase, in questo modo:

class TestStringMethods(unittest.TestCase):

Quindi crei una funzione per ciascuno dei tuoi test all’interno della classe. Utilizzi una delle sue funzioni di asserzione per determinare i risultati del test. Ad esempio, self.assertEquals() verifica se l’output di una funzione è uguale all’output previsto. Ce ne sono molti, comprese le asserzioni booleane (che verificano se qualcosa è vero o falso), maggiore o minore e corrispondenze per le espressioni regolari. Una versione più recente, Unitest2, supporta più di queste asserzioni.

Una caratteristica utile di questo strumento è la sua capacità di supportare i dispositivi. Queste sono le ambizioni implicite di sostenere il programma. Ad esempio, potrebbe essere necessario accedere a un database e recuperare un primo record per poter verificare che la funzione sia corretta con un determinato input. Un dispositivo con il consenso di farlo.

Unittest è un ottimo framework per scrivere script di test di base. L’uso di una classe per i casi di test è costituito da raggroup e test associati alla funzionalità del software. Tuttavia, diventa rapidamente una grazia impressionante per la sua insistenza sull’editing e sui test in classe.

Nose2

Le limitazioni di Unittest hanno lasciato margini di miglioramento, quindi gli sviluppatori di terze parti lo hanno aggiornato con il proprio framework di test chiamato Nose, successivamente sostituito con Nose2.

Poiché questo framework di test estende Unittest, può eseguire test Unittest insieme ai propri. Nose2 è estensibile, fornendo supporto per plugin che gli danno il potenziale per offrire più funzioni di Unittest. Aggiunge anche un’altra importante caratteristica: la parametrizzazione.

La maggior parte dei test richiede input multipli per essere sicuri che nessun elemento strano sfugga. Ad esempio, se stai testando una funzione che convalida il prezzo di un prodotto, potresti provare a inserire vari prezzi con diversi numeri di cifre. Potresti anche voler inserire altri prezzi che potrebbero non superare il test, come 0,00, un prezzo negativo e forse prezzi con caratteri non numerici. Piuttosto che creare un singolo test per ciascuno di questi input, sarebbe meglio eseguire un test che potrebbe rieseguirsi con gli input di un elenco. Nose2 ti consente di farlo.

Pytest

Pytest è un framework di unit test alternativo a Unittest ed è progettato per test semplici ma altamente funzionali. Anche gli sviluppatori di Nose2 lo consigliano come una buona opzione per chi è nuovo ai test sulla loro pagina GitHub.

Poiché PyTest è una libreria di test open source di terze parti, è necessario installare questo strumento open source prima di utilizzarlo. Una differenza rispetto a Unittest è l’uso delle funzioni senza la necessità di una classe. Ciò significa che Pytest richiede meno codice per creare test rispetto a Unittest.

Diciamo che abbiamo una funzione per aggiungere 1 a un input:

def inc(x):

return x + 1

Mentre unittest richiede di contenere un test per questo sistema in una classe separata, puoi semplicemente scrivere un test come una funzione separata, semplificando l’intero processo.

Quindi utilizziamo una semplice funzione di asserzione per testare il risultato come una funzione separata nello stesso file:

def test_answer():

assert inc(3) == 4

Proprio come in unittest, la funzione assert ti consente di descrivere l’aspetto di un test quando passa. In questo caso, l’esecuzione della funzione inc con un input di tre dovrebbe restituire un risultato di 4. In caso contrario, PyTest segnalerà che il test non è riuscito.

Pytest è anche estensibile e dispone di una libreria di plugin completa.

DocTest

Per un metodo alternativo di test del codice, che ne dici di scrivere i tuoi test direttamente nella tua documentazione? DocTest fa riferimento direttamente alla documentazione del codice per i suoi test. Scrivi la tua documentazione come faresti normalmente, ma incorpori esempi di chiamate di funzione con input e risultati appropriati al suo interno.

È possibile incorporare questi test in docstring a livello di funzione o modulo. Quindi puoi richiamarlo dalla riga di comando o includere le istruzioni per eseguirlo nella parte inferiore dei moduli. In alternativa, puoi incorporare i test in file di aiuto .rst separati per file di documentazione più grandi.

Come Nose2, DocTest ha il vantaggio di integrarsi con i test Unittest esistenti e fornisce un modo elegante per combinare insieme test e documentazione. Il rovescio della medaglia, tuttavia, non include la gestione delle partite.

Behave

Questi strumenti sono tutti utili per i test unitari, in cui si testano singole funzioni rispetto agli input di base. Tuttavia, potrebbero non consentirti di testare combinazioni di funzioni che producono risultati aziendali che interessano ai tuoi utenti. A un dirigente aziendale potrebbe non interessare che una funzione convalidi l’indirizzo e-mail di accesso di un cliente, ma vorrebbe essere sicuro che il programma elenchi gli ordini in sospeso di un utente dopo che ha effettuato l’accesso.

È qui che entra in gioco lo sviluppo guidato dal comportamento. Testa scenari e risultati che corrispondono strettamente alle attività che interessano agli utenti di software. Questi sono conosciuti nel gergo di sviluppo come storie degli utenti.

La libreria di test di Behave utilizza file di specifiche per testare queste storie, che gli sviluppatori devono scrivere in un linguaggio chiamato Gherkin. Definisce gli scenari applicativi, quindi utilizza una struttura di passaggi per definire i test, ad esempio:

given I log in

when I have an outstanding order

then I see my outstanding order

L’istruzione fornita configura l’ambiente per eseguire il test. In questo esempio, login descrive che l’utente deve essere connesso al sistema prima che venga eseguito il test. L’istruzione when descrive quindi la condizione che stai testando (in questo caso, verifica cosa dovrebbe accadere quando un utente che ha effettuato l’accesso ha un ordine in sospeso). Infine, l’istruzione then descrive il risultato desiderato quando la condizione è soddisfatta (l’utente dovrebbe vedere il proprio ordine in sospeso) ..

Definisci il codice testato in questi passaggi all’interno di un file di passaggi separato usando i decoratori Python. Per esempio:

@given('I log in')

def step_impl(context)

# call the necessary login functions here

@when(‘I have an outstanding order’)

def step_impl(context)

# call the necessary order retrieval functions here

@then(‘I see my outstanding order’)

def step_impl(context)

assert (len (order_list) > 0)

Come con altri framework di test, puoi scrivere questi test prima di mettere insieme il tuo codice. Falliranno tutti, ovviamente, fino a quando non scriverai le funzioni per supportarli.

La maggior parte dello sviluppo basato sul comportamento è che scrivendo i test, stai documentando i requisiti degli utenti in modo strutturato in anticipo. È quindi possibile utilizzare questi test come guida durante la stesura della domanda.

Selenium

Questi strumenti sono tutti molto adatti per testare il codice dell’applicazione in esecuzione localmente, ma come li colleghi alle azioni dell’utente nelle applicazioni basate su browser? È possibile scrivere test da eseguire a livello di controller se si utilizza un’architettura model-view-controller, come abbiamo documentato nella nostra serie sullo sviluppo di Flask, ma un modo più utile e intuitivo per testare gli input basati su browser è simulare il browser stesso. L’automazione del browser ti consente di testare l’input del programma dal punto di vista dell’utente e in Python c’è una soluzione ideale: Selenium.

Selenium simula un browser che puoi programmare per eseguire automaticamente le azioni comuni dell’utente, incluso l’inserimento di testo nei moduli Web e il clic sui pulsanti. Puoi farlo scrivendo script in una vasta gamma di linguaggi tra cui Java, Ruby e Python. Lo script trova gli elementi in una pagina Web utilizzando i loro nomi o altri parametri, quindi esegue azioni su di essi.

Piuttosto che funzionare come uno strumento di test stesso, Selenium è una libreria che puoi chiamare dall’interno del tuo framework di test Python preferito, come Pytest.

Ad esempio, potresti utilizzare questo strumento per testare un modulo che richiede il codice postale di un utente e un altro che richiede il suo paese. Puoi utilizzare PyTest per trasportare i dati di test rilevanti, come “90210” e “Stati Uniti”. Quindi manipoleresti Selenium per inserire quei dati nel browser chiamando Selenium per trovare il campo chiamato codice postale e quindi inserendo il codice postale. Quindi selezionerebbe il paese pertinente dall’elenco a discesa dei paesi e infine troverà il pulsante di invio e farà clic automaticamente su di esso.

Quindi, chiamerai Selenium per interpretare l’output del browser, passandolo a un’asserzione in Pytest in modo da poterlo confrontare con il risultato atteso.

Selenium ti consente di testare il tuo programma dal punto di vista di un utente. Abbinandolo alla parametrizzazione nel tuo framework di test, puoi inviare dozzine o centinaia di combinazioni per testare una moltitudine di voci di moduli complessi e altre interazioni del browser.

Post Correlati