Cesco
Cesco

Il mio blog personale

Francesco
Author

Share


Tags


Testing con Python e Flask

FrancescoFrancesco

Adesso non ho il tempo per descrivere il processo perchè devo andare al lavoro, comunque per effettuare il testing della mia app scritta con Flask utilizzo il seguente codice.

Il trucco sta tutto nello spiegare a Werkzeug (il backend che gestisce le richieste HTTP) che deve mettersi nella modalità di testing ed accettare le simulazioni di invio dati che gli fa il sistema, attraverso questo codice:

def setUp(self):  
    app.config['TESTING'] = True
    app.config['WTF_CSRF_ENABLED'] = False
    self.app = app.test_client()

 
Per fare il testing è necessario inserire tutti i test all'interno di una classe e far derivare la classe da unittest.TestCase

Poi siccome devono dialogare fra loro Flask ed AngularJS (che dialoga tramite Ajax, e non tramite il linguaggio di Flask) devo utilizzare una piccola funzione che trasformi il testo che invio da testare in formato AJAX, in modo che poi quando viene gestito da Flask l'AJAX venga nuovamente convertito in testo (si lo so, è un doppio passaggio ma è necessario affinchè lo script funzioni..)

Questo è il codice sorgente completo dello script che fa testing:

import unittest  
import json

""" app è lo script con la mia applicazione Flask """
from app import app


class TestiamoEvviva(unittest.TestCase):

    def post_in_ajax(self, p_indirizzo, p_dati=None):

        return json.loads(self.app.post(p_indirizzo, data=p_dati).data.decode())

    def setUp(self):
        """ Metodo che viene chiamato prima di ogni test """

        app.config['TESTING'] = True
        app.config['WTF_CSRF_ENABLED'] = False
        self.app = app.test_client()

    def tearDown(self):
        """ Metodo che viene chiamato alla fine di ogni test """

        pass

    def test_accesso_senza_dati(self):
        """Accede alla funzione fetch senza passare dati"""

        dati_ricevuti = self.post_in_ajax("/fetch")
        self.assertEqual("error", dati_ricevuti["status"])

    def test_accesso_con_dati_sbagliati(self):
        """Accede alla funzione fetch passandogli una richiesta sbagliata vedendo che succede"""

        dati_ricevuti = self.post_in_ajax("/fetch", "{\"richiesta\": \"Ajeje\"}")
        self.assertEqual("error", dati_ricevuti["status"], "Ho ricevuto {0}".format(dati_ricevuti))

    def test_richiesta_elenco_prenotati(self):
        """Accede alla funzione fetch per richiedere l'elenco dei prenotati del 01/01/2016"""

        dati_ricevuti = self.post_in_ajax("/fetch", "{\"richiesta\": \"elenca\", \"data\": \"2016-01-01\"}")
        self.assertEqual("ok", dati_ricevuti["status"], "Ho ricevuto {0}".format(dati_ricevuti))
        self.assertEqual("2016-01-01", dati_ricevuti["data"], "La data restituita dal server non corrisponde a quella richiesta")

    def test_richiesta_aggiunta_prenotato(self):
        """Accede alla funzione fetch per richiedere l'aggiunta di un nuovo prenotato"""

        dati_ricevuti = self.post_in_ajax("/fetch", "{\"richiesta\": \"aggiungi\"}")
        self.assertEqual("ok", dati_ricevuti["status"], "Ho ricevuto {0}".format(dati_ricevuti))

 
Non serve aggiungere nulla. Quando unittest comincia a fare il suo lavoro si accorge automaticamente dei test da effettuare andando a vedere tutti i moduli nella classe che nel loro nome contengono la parola "test".

Francesco
Author

Francesco

Comments