2012-07-22 11 views
6

Sto lavorando su un modulo che utilizza socket con centinaia di test case. Che è bello Tranne ora ho bisogno di testare tutti i casi con e senza socket.setdefaulttimeout (60) ... Per favore non dirmi di tagliare e incollare tutti i test e di impostare/rimuovere un timeout predefinito in setup/teardown.python si sblocca con più configurazioni?

Onestamente, ho capito che avere ogni caso di test disposto su di esso è una buona pratica, ma anche a me non piace ripetermi. Questo è davvero solo test in un contesto diverso non test diversi.

Vedo che l'unittest supporta le impostazioni di livello del modulo/i proiettori di demolizione, ma non è ovvio per me come convertire il mio modulo di test in test due volte con due impostazioni diverse.

qualsiasi aiuto sarebbe molto apprezzato.

risposta

4

Le altre risposte su questo argomento sono valido in quanto consente di eseguire effettivamente i test in più ambienti, ma giocando con le opzioni penso che mi piace un approccio più autonomo. Sto usando suite e risultati per organizzare e visualizzare i risultati dei test. Per eseguire un test con due ambienti anziché due test, ho seguito questo approccio: creare una sottoclasse di TestSuite.

class FixtureSuite(unittest.TestSuite): 
    def run(self, result, debug=False): 
     socket.setdefaulttimeout(30) 
     super().run(result, debug) 
     socket.setdefaulttimeout(None) 
... 
suite1 = unittest.TestSuite(testCases) 
suite2 = FixtureSuite(testCases) 
fullSuite = unittest.TestSuite([suite1,suite2]) 
unittest.TextTestRunner(verbosity=2).run(fullSuite) 
4

lo farei in questo modo:

  1. fare tutti i test derivano dalla propria classe TestCase, chiamiamolo SynapticTestCase.

  2. In SynapticTestCase.setUp(), esaminare una variabile di ambiente per determinare se impostare il timeout del socket o meno.

  3. Eseguire l'intera suite di test due volte, una volta con la variabile di ambiente impostata in un modo, quindi di nuovo con l'impostazione nell'altro senso.

  4. Scrivere un piccolo script di shell per richiamare la suite di test in entrambi i modi.

+0

questo suona bene, ma è corsa devo automatizzati sia con che senza un timeout predefinito. – underrun

+0

Aggiornato: usa uno script di shell o un piccolo script Python per eseguire i test in entrambi i modi. –

1

Se il codice non chiama socket.setdefaulttimeout quindi è possibile eseguire i test nel modo seguente:

import socket 
socket.setdeaulttimeout(60) 
old_setdefaulttimeout, socket.setdefaulttimeout = socket.setdefaulttimeout, None 
unittest.main() 
socket.setdefaulttimeout = old_setdefaulttimeout 

Si tratta di un hack, ma può funzionare

+0

funziona per testarlo con il timeout predefinito, ma non senza. Ho bisogno di testare tutti i test in entrambi i modi – underrun

+0

Quindi basta aggiungere 'socket.setdefaulttimeout (OTHER_VALUE); unittest.main() 'fino alla fine. –

Problemi correlati