2010-03-03 13 views
10

C'è un modo (utilizzando il framework standard Django.test.TestCase) per eseguire un'inizializzazione globale di alcune variabili, in modo che avvenga solo una volta.impostazione globale nel framework di test di Django?

Mettere le cose setUp() fa in modo che le variabili siano inizializzate prima di ogni test, che uccide le prestazioni quando l'installazione comporta operazioni costose. Mi piacerebbe eseguire una funzione di tipo setup una volta, e quindi avere le variabili inizializzate qui saranno visibili a tutti i miei test.

Preferirei non riscrivere il framework del test runner.

Sto pensando a qualcosa di simile a un prima (: tutti) nel mondo Ruby/RSpec.

-S

risposta

2

Non è necessario "ri-scrivere l'intera prova quadro corridore", ma è necessario creare un test_runner personalizzato (si può solo copy the existing one e modificarlo per includere il codice di configurazione globale) . Sono circa 100 righe di codice. Quindi imposta l'impostazione TEST_RUNNER in modo che punti al tuo runner personalizzato e via.

+0

Giusto - Stavo cercando di evitare un runner di test personalizzato - non sembra che io possa avere una scelta. Più lavoro con Django, più mi manca Rails. Python ha un supporto di libreria scientifico molto migliore, quindi credo di poter vivere con esso. – shreddd

+1

Penso che il test runner usato fosse come 15-30 linee di codice nelle versioni più datate di Django, quindi probabilmente non lo consideravano un grosso problema copiarlo e crearne uno nuovo. È stato modificato in un'intera classe e è cresciuto di dimensioni nelle versioni successive. Puoi sempre suggerire una richiesta di funzionalità da aggiungere in modo da eseguire un codice di installazione aggiuntivo (magari in setup_test_environment()) senza specificare un nuovo runner (un'impostazione aggiuntiva o un segnale globale)? –

+0

Grazie ancora per i suggerimenti: stavo cercando un modo dichiarativo per farlo seguendo le linee di setUp() ma sembra che potrei dover montare un corridore. Una richiesta di funzionalità ha senso. – shreddd

0

Che dire di una classe con variabili statiche? Qualcosa di simile:

class InitialSetup(object): 
    GEOLOCATOR = GeoLocator() 
    DEFAULT_LOCATION = GEOLOCATOR.get_geocode_object(settings.DEFAULT_ADDRESS, with_country=True) 

    def setUp(self): 
     self.geolocator = InitialSetup.GEOLOCATOR 
     self.default_location = InitialSetup.DEFAULT_LOCATION 
     p = Page.objects.create(site_id=settings.SITE_ID, template='home_page.html') 
     p.publish() 
     self.client = Client() 


class AccessTest(InitialSetup, Testcase): # Diamond inheritance issue! inheritance order matters 
    def setUp(self): 
     super(AccessTest, self).setUp() 


    def test_access(self): 
     # Issue a GET request. 
     response = self.client.get('/') 

     # Check that the response is 200 OK. 
     self.assertEqual(response.status_code, 200) 
+1

Ciao Maazza - sì uno può incidere il problema con il problema impostazione di variabili statiche o di classe, tuttavia, stavo cercando una soluzione dichiarativa incorporata. Sembra che questo sia parzialmente risolto nelle versioni più recenti di python con la funzione setUpClass(). – shreddd

2

Questo è in parte risolto nelle versioni più recenti di pitone/django da setUpClass(), che almeno mi permetterà per eseguire l'installazione livello di classe.