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
-
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.
-