2011-12-13 21 views
5

Ho diversi moduli di test che vengono tutti richiamati tramite uno script del driver che può richiedere una varietà di argomenti. I test stessi sono scritti usando il modulo unittest python.Passare gli argomenti di script Python per testare i moduli

import optparse 
import unittest 
import sys 
import os 

from tests import testvalidator 
from tests import testmodifier 
from tests import testimporter 

#modify the path so that the test modules under /tests have access to the project root 
sys.path.insert(0, os.path.dirname(__file__)) 

def run(verbosity): 
    if verbosity == "0": 
      sys.stdout = open(os.devnull, 'w') 

    test_suite = unittest.TestSuite() 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testvalidator.TestValidator)) 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testmodifier.TestModifier)) 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testimporter.TestDataImporter)) 

    unittest.TextTestRunner(verbosity=int(verbosity)).run(test_suite) 

if __name__ == "__main__": 

    #a simple way to control output verbosity 
    parser = optparse.OptionParser() 
    parser.add_option("--verbosity", "--verbosity", dest="verbosity", default="0") 
    (options, args) = parser.parse_args() 

    run(options.verbosity) 

mio problema è che, all'interno di questi moduli di test, ho alcuni test vorrei saltare basato su diversi parametri passati al driver. Sono consapevole che l'unittest fornisce una famiglia di decoratori intenzionati a farlo, ma non conosco il modo migliore per trasmettere queste informazioni ai singoli moduli. Se avessi un argomento --skip-slow, ad esempio, come avrei potuto annotare i test come lenti e averli saltati?

Grazie per il vostro tempo.

+0

Forse ho trovato una soluzione che è possibile utilizzare. Controlla la mia risposta. –

risposta

2

Mi ero infatti chiesto questo da solo e alla fine ho trovato la soluzione.

file principale ...

... 
if __name__ == '__main__': 
    args = argparser() 

    from tests import * 

    ... 

e nel vostro moduli di test, basta fare:

from __main__ import args 

print args 

ho provato questo fuori, e ha funzionato piuttosto bene. La cosa bella è quanto sia semplice, e non è affatto un trucco.

1

È possibile utilizzare il test runner nose con il plug-in attrib che consente di selezionare casi di test in base agli attributi. In particolare, l'esempio nella documentazione del plug-in utilizza @attr(slow) per contrassegnare i casi di test lenti.

Dopo di che, dalla linea di comando:

  • Per selezionare tutti i test marcati come slow:

    $ nosetests -a slow

  • Per selezionare tutti i test non contrassegnati come slow:

    $ nosetests -a '!slow'

+0

Probabilmente ho bisogno di familiarizzarmi con il naso, perché sembra che l'unittest possa non essere all'altezza. Speravo di non dover aggiungere una dipendenza. – zchtodd

+1

Puoi creare il tuo decor 'attr' basato su' unittest.skipIf'/'unittest.skipUnless' e alcune variabili d'ambiente che sono usate nella condizione che i decoratori di skip controllino, ma non direi che ne vale la pena quando hai qualcosa che funziona già fuori dagli schemi. – jcollado

Problemi correlati