2012-04-27 39 views
8

Ho scritto un pacchetto (http://github.com/anntzer/parsedcmd) che viene eseguito con Python2 e Python3. Tuttavia, ho dovuto scrivere test unitari separati (py.test) per Python2 e Python3 (principalmente perché voglio testare le funzionalità extra di Python3, in particolare argomenti solo per le parole chiave), quindi ho un test_py2.py e un test_py3.py in un sotto pacchetto test . Ora, se corro, dico py.test2 mypkg, test_py2 passaggi, ma test_py3 non riesce con uno SyntaxError. Allo stesso modo, per, test_py3 passa ma test_py2 non riesce (potrei fare questo lavoro però, è solo un problema di StringIO aver spostato a io).py.test con Python2 e Python3

posso progettare il test subpackage in modo che import mypkg.test importa solo la versione corretta delle prove, ma a quanto pare py.test non si preoccupa - semplicemente vede due file corrispondenti test_* e afferra tutte le prove in ciascuno di essi, ignorando cosa __init__.py gli dice di importare.

Quindi adesso devo fare entrambi py.test2 mypkg/test/test_py2.py e py.test3 mypkg/test/test_py3.py. C'è un modo per impostare il tutto in modo che py.test2 mypkg e py.test3 mypkg "funzionino"?

Grazie.

risposta

5

Se è quindi possibile rendere i moduli imponibili su tutti gli interpreti e saltare i test in modo appropriato è una soluzione comune. In caso contrario, si può mettere la seguente come "conftest.py" nella directory di test:

import sys 
py3 = sys.version_info[0] >= 3 

class DummyCollector(pytest.collect.File): 
    def collect(self): 
     return [] 

def pytest_pycollect_makemodule(path, parent): 
    bn = path.basename 
    if "py3" in bn and not py3 or ("py2" in bn and py3): 
    return DummyCollector(path, parent=parent) 

Questo si fa prendere un plugin specifico per il progetto e sarà correttamente ignorare un modulo di test con un nome di file che contiene un "PY2" o " py3 "sottostringa sulla versione errata dell'interprete. Ovviamente puoi perfezionarlo per avere un elenco esplicito direttamente nel file conftest.py invece di controllare il nome del file, ecc.

HTH, holger

0

Inserire i test in pacchetti diversi ed eseguire solo i test nel pacchetto appropriato. Oppure caricare il modulo test appropriato in uno script:

import sys, unittest 

cur_version = sys.version_info() 

if cur_version[0] < 3 
    import myApp.test.test_py2 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py2).run() 
else: 
    import myApp.test.test_py3 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py3).run() 

o utilizzare un file setup.py modo da poter eseguire

python setup.py test

e mettere la logica delle versioni in là:

versionedTestSuite = "parsedcmd.test.test_py2" # do something as above here 
setup(name='parsedcmd', 
     ... 
     test_suite=versionedTestSuite, 
    ) 
Problemi correlati