2010-03-03 15 views
10

Czy jest jakiś sposób (przy użyciu standardowego frameworku Django.test.TestCase) do przeprowadzenia globalnej inicjalizacji niektórych zmiennych, tak aby zdarzyło się tylko raz.globalna konfiguracja w środowisku testowym django?

Umieszczanie rzeczy setUp() sprawia, że ​​zmienne są inicjowane przed każdym testem, co zabija wydajność, gdy konfiguracja wymaga kosztownych operacji. Chciałbym raz uruchomić funkcję typu konfiguracji, a następnie zainicjować zmienne tutaj widoczne dla wszystkich moich testów.

Wolałbym nie przepisywać struktury programu testowego.

Mam na myśli coś podobnego do wcześniejszego (: wszystkich) w świecie Ruby/RSpec.

-S

Odpowiedz

2

Nie trzeba do „re-write całego testu biegacz ramy”, ale trzeba będzie utworzyć niestandardową test_runner (można tylko copy the existing one i zmodyfikować go na swój globalny kod instalacyjny) . To około 100 linii kodu. Następnie ustaw wartość TEST_RUNNER, tak aby wskazywała na niestandardową prowadnicę i kontynuuj.

+0

Po prawej - próbowałem uniknąć niestandardowego testu biegowego - nie wygląda na to, że mogę mieć wybór. Im więcej pracuję z Django, tym bardziej brakuje mi Railsów. Python ma jednak znacznie lepsze wsparcie dla bibliotek naukowych, więc myślę, że mogę z tym żyć. – shreddd

+1

Wydaje mi się, że biegacz testowy był 15-30 linijką kodu w starszych wersjach Django, więc prawdopodobnie nie uważali, że to wielka sprawa, aby go skopiować i utworzyć nowy. Zmieniło się w całą klasę i urosło w późniejszych wersjach. Zawsze możesz zasugerować żądanie funkcji, aby dodać w taki sposób, aby uruchomić dodatkowy kod instalacyjny (może w setup_test_environment()) bez określania zupełnie nowego programu uruchamiającego (dodatkowe ustawienie lub sygnał globalny)? –

+0

Jeszcze raz dziękuję za porady - szukałem ładnego, deklaratywnego sposobu na zrobienie tego na wzór setUp(), ale wygląda na to, że mogę ustawić biegacza. Żądanie funkcji ma sens. – shreddd

0

Co o klasie zmiennych statycznych? Coś jak:

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

Witaj Maazza - tak można hakować wokół problemu przez ustawiając zmienne statyczne lub klasy, jednak szukałem deklaratywnego wbudowanego rozwiązania, Wygląda na to, że jest to częściowo rozwiązane w nowszych wersjach Pythona z funkcją setUpClass(). – shreddd

2

ta jest częściowo uwzględniona w nowszych wersjach python/django przez setUpClass(), który będzie przynajmniej pozwala mi uruchomić konfigurację poziomu klasy.

Powiązane problemy