[Python] invocare super.setup automaticamente

Valerio Maggio valerio.maggio a gmail.com
Ven 8 Nov 2013 10:04:42 CET


On 08 Nov 2013, at 09:43, enrico franchi <enrico.franchi a gmail.com> wrote:

> 
> 
> 
> 2013/11/8 Valerio Maggio <valerio.maggio a gmail.com>
> 
> On 08 Nov 2013, at 07:52, Marco Beri <marcoberi a gmail.com> wrote:
> 
>> 2013/11/8 Piergiuliano Bossi <pgbossi a gmail.com>
>> Mi sembra di capire che in Python sia con unittest che con nose non ci sia un modo builtin per far si' che, in una gerarchia di test, la setup della superclasse venga invocata automaticamente eseguendo un test della sottoclasse. Quello che vedo e' che di solito il primo step della setup della sottoclasse e' invocare la setup della superclasse (yak!).
>> 
>> Prima domanda: confermate?
>> 
>> Sì, questo è il comportamento standard di Python.
>>  
>> Seconda domanda: vi rassegnate o c'e' qualche escamotage?
>> 
>> Ti fa schifo così?
>> 
>> class Father(object):
>>     def setUp(self):
>>         print "Padre"
>>         self.childrenSetUp()
>> 
>> class Children(Father):
>>     def childrenSetUp(self):
>>         print "Figlio"
>> 
>> x = Children()
>> x.setUp()
> 
> A me, sinceramente, un pochino si :D
> Scherzi a parte, credo che in questo caso imho hai "spostato" il problema, "specializzando" il setUp della superclasse.
> 
> 
> Beh, e' un classico template method pattern… 

Si, vero!
Non so per quale motivo ero convinto che fosse un "template method" al contrario (in termini di ruoli).. ma in verità mi sbagliavo!
È un template a tutti gli effetti.
Probabilmente sono stato fuorviato dal fatto che pensavo più al setUp del test che al problema in generale…una cosa del tipo

class Father(unit test.TestCase):
    def setUp(self):
        self.pre_setup()
        # father_setup_code
        self.post_setup()

    def pre_test(self):
        pass # non ho messo raise NotImplementedError per renderlo più flessibile per le sottoclassi
   
    def post_test(self):
        pass

potrebbe andare in generale :-)
In ogni caso, per dovere di cronaca, aggiungerei che nose, rispetto a unittest, è più flessibile sulla faccenda setup: decoratore with_setup o tutti i metodi che rispettano il naming patter setup_<whatever>
(https://nose.readthedocs.org/en/latest/writing_tests.html#test-classes)
  

>  
> Mmm imho no… nel senso che con la metaclasse agisci a livello di classe e non di istanza e il setUp deve essere invocato per *ogni* test dell'istanza correntemente in esecuzione.
> Probabilmente mi sbaglio, non c'ho riflettuto a lungo, ma ad intuito questo è quello che mi viene in mente.
> 
> https://gist.github.com/rik0/7367887 
> 

Stupendo!! :-)
--
valerio


-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20131108/77d1a71b/attachment.html>


Maggiori informazioni sulla lista Python