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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top