script di test naso con gli argomenti della riga di comando
-
11-09-2019 - |
Domanda
Mi piacerebbe essere in grado di eseguire uno script di test naso, che accetta argomenti della riga di comando. Per esempio, qualcosa sulla falsariga:
test.py
import nose, sys
def test():
# do something with the command line arguments
print sys.argv
if __name__ == '__main__':
nose.runmodule()
Tuttavia, ogni volta che ho eseguito questo con un argomento da riga di comando, ottengo un errore:
$ python test.py arg
E
======================================================================
ERROR: Failure: ImportError (No module named arg)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 368, in loadTestsFromName
module = resolve_name(addr.module)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/util.py", line 334, in resolve_name
module = __import__('.'.join(parts_copy))
ImportError: No module named arg
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
A quanto pare, il naso cerca di fare qualcosa con gli argomenti passati in sys.argv. C'è un modo per rendere il naso ignorare tali argomenti?
Soluzione
Va bene, io odio "perché si vuole fare questo?" risposte tanto quanto chiunque, ma ho intenzione di dover fare uno qui. Spero che non ti dispiaccia.
direi che fare qualunque cosa hai intenzione di fare non è nell'ambito di applicazione del naso quadro. Naso è destinato per automatizzati test. Se dovete passare argomenti della riga di comando per la prova da superare, allora non è automatizzato. Ora, ciò che si possono fare è qualcosa di simile:
import sys
class test_something(object):
def setUp(self):
sys.argv[1] = 'arg'
del sys.argv[2] # remember that -s is in sys.argv[2], see below
def test_method(self):
print sys.argv
Se si esegue che, si ottiene questa uscita:
[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(Ricordati di passare l'opzione -s se volete vedere cosa succede stdout)
Tuttavia, probabilmente sarei ancora vivamente contro che, come è generalmente una cattiva idea a pasticciare con lo stato globale nel test automatizzati, se si può evitare. Quello che vorrei fare è probabile adattarmi qualsiasi codice Sono voler provare a prendere un elenco argv
. Quindi, si può passare a quello che vuoi durante i test e passare sys.argv
in produzione.
Aggiorna :
Il motivo per cui ho bisogno di fare è perché sto test multipli implementazioni della stessa libreria. Per provare queste implementazioni sono correggo io uso un singolo script naso, che accetta come una linea di comando l'argomento della libreria che dovrebbe importare per il test.
Sembra che si consiglia di provare a scrivere un plugin naso. E 'abbastanza facile da fare. Ecco gli ultimi documenti.
Altri suggerimenti
Si potrebbe utilizzare un altro mezzo per ottenere cose nel codice:
import os
print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
Poi basta ricordarsi di impostare il vostro ambiente prima di eseguire il naso.
Credo che questo sia uno scenario perfettamente accettabile. Ho anche bisogno di fare qualcosa di simile, al fine di eseguire i test contro diversi scenari (dev, QA, prod, ecc) e non avevo bisogno gli URL di destra e configurazioni per ogni ambiente.
La soluzione che ho trovato è stato quello di utilizzare il naso-testconfig Plugin ( Link qui ). Non è esattamente passaggio di argomenti della riga di comando, ma la creazione di un file di configurazione con tutti i parametri, e poi passando il file di configurazione come argomento quando si esegue il naso-test.
Il file di configurazione ha il seguente formato:
[group1]
env=qa
[urlConfig]
address=http://something
[dbConfig]
user=test
pass=test
E si può leggere gli argomenti utilizzando:
from testconfig import config
print(config['dbConfig']['user'])
Per ora sto usando il seguente trucco:
args = sys.argv[1:]
sys.argv = sys.argv[0:1]
, che legge solo l'argomento in una variabile locale, e quindi elimina tutti gli argomenti aggiuntivi nel sys.argv
in modo che il naso non venga confuso da loro.
Basta esecuzione di naso e passando i parametri non funzionerà come il naso tenterà di interpretare gli argomenti come parametri naso in modo da ottenere i problemi che state vedendo.
Non credo parametro supporto naso passando direttamente ancora, ma questo naso plug-in nose- testconfig Consente di scrivere i test come di seguito:
from testconfig import config
def test_os_specific_code():
os_name = config['os']['type']
if os_name == 'nt':
pass # some nt specific tests
else:
pass # tests for any other os