2011-08-11 14 views
6

Próbuję zacząć od unittest, ale mam problem z uzyskaniem setUpClass() do pracy. Tu jest mój kodu testu ...Unittest setUpClass nie działa

import unittest 

class TestRepGen(unittest.TestCase): 
    """ Contains methods for training data testing """ 

    testvar = None 

    @classmethod 
    def setUpClass(cls): 
     cls.testvar = 6 

    def test_method(self): 
     """ Ensure data is selected """ 
     self.assertIsNotNone(self.testvar,"self.testvar is None!") 

# run tests 
if __name__ == '__main__': 
    unittest.main() 

wyświetlony komunikat o błędzie jest assert, wskazując, że self.testvar == None, i nie został zmieniony przez setUpClass(). Czy coś jest nie tak z moim kodem?

Otrzymuję ten sam wynik, jeśli uruchomię kod z mojego IDE (Wing) lub bezpośrednio z wiersza poleceń. Dla porównania używam Pythona 3.2.1 w Windows7.

+0

Próbowałem twój kod na Pythonie 2.7 pod Windows 7. Działa dobrze, test przechodzi. Jeśli uruchomisz _exactly_ powyższy skrypt, to naprawdę nie działa dla Ciebie? dokumenty dla Pythona 3.3 nie wskazują żadnej zmiany w zachowaniu 'setUpClass'. – agf

+0

Kod wklejony działa dla mnie w python27 i python 3.2.1 na Windows 7. – stderr

+0

Czy masz powód, dla którego używasz setUpClass? Dlaczego nie po prostu użyj 'def setUp (self)'? – Bogdan

Odpowiedz

1

OK - już pora na przyjęcie, że to był mój błąd. Używałem 3.1.2, kiedy powinienem (i myślałem, że jestem) używać 3.2.1. Zmieniłem teraz poprawną wersję, wszystko jest dobrze, a test przechodzi. Wielkie podziękowania dla wszystkich, którzy odpowiedzieli (i przepraszam za zmarnowanie twojego czasu :-)).

5

Zgaduję, że nie wywołujecie tej klasy bezpośrednio, lecz klasę pochodną.

Jeśli tak jest, musisz zadzwonić pod numer setUpClass() ręcznie - nie jest on automatycznie wywoływany.

class TestB(TestRepGen): 
    @classmethod 
    def setUpClass(cls): 
     super(TestB, cls).setUpClass() 

Również accoding do the docsclass-level fixtures are implemented by the test suite. Tak więc, jeśli dzwonisz pod numer TestRepGen lub test_method w jakiś dziwny sposób, który nie został opublikowany, setUpClass może nie zostać uruchomiony.

+0

agf - Dzwoniłem bezpośrednio do klasy, ale ostatecznie miała ona zostać poddana subklasie, więc twoje komentarze są użyteczne. Dzięki. –

+0

@Alan - Powinieneś opublikować swoje rozwiązanie jako odpowiedź i zaakceptować je. – agf

+0

Rozwiązanie opublikowane. –

10

setUpClass jest nowym systemem unittest od wersji 2.7 i 3.2. Jeśli chcesz używać go ze starszą wersją, będziesz musiał użyć nos jako Twój biegacz testowy zamiast unittest

+0

Niezły chwyt! Zastanawiam się, dlaczego setUpClass nie działa. – fthinker

+0

* testrunner * zope.testing * nie obsługuje 'setUpClass()'. – jnns

Powiązane problemy