Tests

Alcuni test che facciamo sulle API risultano molto ripetitivi, fra questi alcuni, di cui vogliamo solo testare lo stato sono facilmente generabili da una descrizione sintetica che possiamo mettere su un file csv o un dizionario.

Altri test che necessotano argomenti particolari (probabilmente la maggior parte) saranno trattai nel modo convenzionale con suite di test dedicate.

Test con Metaclassi

Questo modulo vuole offrire un metodo efficace per creare una moltitudine di test partendo da una descrizione semplice e possibilmente efficace (dict o csv)

Il pacchetto offre quindi un paio di Metaclassi: una utile per form di dati semplici per cui si usi application/json ed una per chiamate che richiedano content-type multipart/form-data.

L’utilizzo tipico sarà il seguente:

import os

from thx.tests.base_meta import TestUrlBaseMeta
from web.tests.base import BaseAPITest

from .test_specifications import test_dict


class AccountBaseMeta(TestUrlBaseMeta):
    test_dict = test_dict


class AccountTest(BaseAPITest, metaclass=AccountBaseMeta):

    def base_url_test(self, profile, action, url_name, args=None, data=None, return_code=None):
        #print('AccountTest _test_page_base')
        user = getattr(self,  f"{profile}_user1")
        self.client.force_authenticate(user)
        AccountBaseMeta.base_url_test(self, profile, action, url_name, args, data, return_code)

O se si preferisce dichiarare i test in formato csv:

class AccountBaseMetaCSV(TestUrlBaseMeta):
    csv_file = os.path.join(os.path.dirname(__file__), 'test_specification.csv')


class AccountTestCSV(BaseAPITest, metaclass=AccountBaseMetaCSV):

    def base_url_test(self, profile, action, url_name, args=None, data=None, return_code=None):
        #print('AccountTest _test_page_base')
        user = getattr(self,  f"{profile}_user1")
        self.client.force_authenticate(user)
        AccountBaseMetaCSV.base_url_test(self, profile, action, url_name, args, data, return_code)

È importante che l’attributo test_dict e rispettivamente csv_file siano definito direttamente sulla metaclasse in quanto deve essere disponibile nel momento in cui viene creato

Qui si vede chiaramente l’utilizzo di test_dict che è una dizionario di cui diamo un esempio:

test_dict = [
    {
        'name': 'account_list_customer',
        'profile': 'customer',
        'action': 'list',
        'url_name': 'api_account:owner:user_list',
        'return_code': 403,
        'help': 'Test: list, model:template, profile: customer'
    },
    {
        'name': 'account_list_owner',
        'profile': 'owner',
        'action': 'list',
        'url_name': 'api_account:owner:user_list',
        'return_code': 200,
        'help': 'Test: list, model:template, profile: customer'
    }
]

Si veda la metaclasse per la descrizione del significato.

class thx.tests.base_meta.TestUrlBaseMeta[sorgente]

Metaclasse idonea per generare test da una descrizione via dizionario

Name

il nome del test, la metaclasse aggiungerà test_ come prefisso

Profile

il nome del profilo per il quale si crea il tests

Action

la action:

  • length

  • list

  • retrieve

  • create

  • update

  • destroy

  • status_set

  • status_reset

  • enable

  • disable

  • fail

Url_name

il name su cui viene fatta la resolve da Django

Return_code

lo status http atteso

Help

la doctring usata per il metodo di test, utile con l’opzione verbose o in caso di errori

base_url_test(profile, action, url_name, args=None, data=None, return_code=None)[sorgente]

funzione veramente eseguita come test. Verrà tipicamente usata come mostrato nell’esempio per permettere la corretta autenticazione

Parametri
  • profile – il profilo (per auth, disponibile solo per override del metodo): owner, customer…

  • action – una delle azioni elencate nella intestazione della classe

  • url_name – il nome utilizzato dalla reverse

  • args – args per la reverse

  • data – dati per create/update

  • return_code – il codice http atteso

csv_delimiter = ';'

delimitatore di campi per il file csv

csv_field_list = ('name', 'profile', 'action', 'url_name', 'args', 'data', 'return_code', 'help')

lista dei campi del file csv. I nomi non devono essere cambiati

csv_file = None

csv file con i test. test_dict o csv_file sono richiesti

classmethod get_data_from_csv()[sorgente]

Get test data from csv file (generator). If csv_file is present, this method is used to get test data

Parametri

csv_file – csv file that holds the test data

Ritorna

a tuple with name, help, (profile, action, url_name, data args), return_code

classmethod get_test_from_dict()[sorgente]

method (generatore) che assembla gli argomenti per il test partendo dal dizionario

Parametri

data_dict – dizionario con le info

Ritorna

una tupla name, help, (profile, action, url_name), return_code

Tipo di ritorno

tuple

test_dict = {}

dict that holds all info to create a test

class thx.tests.base_meta.TestUrlMultipartMeta[sorgente]

Variante di TestFunctionBaseMeta idonea per upload che avvengano con multipart/form-data

base_test_url(profile, action, url_name, data=None, args=None, return_code=None)[sorgente]

funzione veramente eseguita come test. Verrà tipicamente usata come mostrato.