2010-06-21 14 views
11

Sto cercando un modo per eseguire test su utilità della riga comandi scritti in bash, o qualsiasi altra lingua.comando test utility a riga di

mi piacerebbe trovare un framework di test che avrebbe dichiarazioni come

setup: 
    command = 'do_awesome_thing' 
    filename = 'testfile' 
    args = ['--with', 'extra_win', '--file', filename] 
    run_command command args 

test_output_was_correct 
    assert_output_was 'Creating awesome file "' + filename + '" with extra win.' 

test_file_contains_extra_win 
    assert_file_contains filename 'extra win' 

Presumibilmente il banco di prova di base avrebbe creato una directory temp in cui eseguire questi comandi, e rimuoverlo a teardown.

Preferirei usare qualcosa in Python, poiché ho molta più familiarità con esso rispetto ad altre lingue candidate plausibili.

Immagino che possa esserci qualcosa che usa un DSL che lo renderebbe praticamente indipendente dal linguaggio (o dalla sua lingua, a seconda di come lo si guarda); tuttavia, questo potrebbe non essere l'ideale, dal momento che le mie tecniche di test di solito implicano la scrittura di codice che genera test.

E 'un po' difficile da google per questo, perché ci sono molte informazioni sulle utility che eseguono i test, che è una sorta di opposto di quello che sto cercando.

Supporto per doctests incorporati nella produzione di command --help sarebbe un bonus extra :)

+1

Si potrebbe ottenere alcune informazioni utili da una domanda che ho chiesto di test di unità script di shell: http://stackoverflow.com/questions/971945/unit-testing-for-shell-scripts –

+0

@gareth_bowles: cool, grazie per il collegamento. Potrei provare a usare shunit2 se è bash-compatibile. – intuited

risposta

13

Partenza ScriptTest:

from scripttest import TestFileEnvironment 

env = TestFileEnvironment('./scratch') 

def test_script(): 
    env.reset() 
    result = env.run('do_awesome_thing testfile --with extra_win --file %s' % filename) 
    # or use a list like ['do_awesome_thing', 'testfile', ...] 
    assert result.stdout.startswith('Creating awesome file') 
    assert filename in result.files_created 

E 'abbastanza doctest utilizzabile pure.

+0

Sembra fantastico! Grazie! – intuited

1

Beh ... Che cosa facciamo di solito (e una delle meraviglie di linguaggi OO) è quello di scrivere tutti i componenti di un l'applicazione prima di eseguire effettivamente l'applicazione. Ogni componente potrebbe avere un modo autonomo da eseguire, a scopo di test (da riga di comando, di solito), che permette anche di pensare in loro programmi come completamento di ogni di ogni, e utilizzarli in progetti futuri. Se quello che vuoi è quello di verificare l'integrità di un programma esistente ... beh, penso che il modo migliore è quello di imparare in profonda come funziona, o anche più profonda: leggere la fonte. O ancora più profondo: sviluppare un bot per forzare-test è: 3

Mi dispiace che è quello che ho .-.

+0

Definitivamente .. questo è un ottimo modo per fare le cose. Prendo atto che ciò che descrivi verrebbe definito "test unitario", mentre voglio che un set di strumenti esegua "test di accettazione" o "test funzionale" o "test di integrazione". Ciò è in parte per fornire un ulteriore mezzo per verificare il codice che è testabile dell'unità e anche per consentire una sorta di test sul codice che non è testabile dall'unità: script di bash (a esclusione dell'esistenza di -shudder- un framework di test dell'unità di bash); utilità esterne proprietarie che si comportano in modi scarsamente documentati; o codice in cui una panoplia di aspetti è mescolata in una singola routine. – intuited

+0

Inoltre: per scorrere con la tua terminologia, immagino che quello che sto cercando sia un "quadro dei robot". – intuited

+0

quello che capisco che vuoi fare è trovare un tester generico per i programmi con CLI? Trovo estremamente difficile da realizzare, perché un programma così male documentato è imprevedibile. Se si affronta un software abbastanza sbagliato e la fonte non è disponibile, la scelta migliore sembra essere: provare a cercare programmi simili. O perché no? inserisci la tua difficoltà in un forum:] Va bene o mi sono perso qualcosa? Se lo facessi, cerca di essere più esplicito riguardo al tuo caso personale. – sadasant

0

al di fuori di qualsiasi framework di testing preconfezionato che possa esistere ma non ne sono a conoscenza, vorrei solo sottolineare che ci si aspetta uno strumento fantastico e così sottoutilizzato per questo tipo di automazione, specialmente se si desidera supportare l'interazione multistage, che è per dire non basta inviare un comando e controllare l'output, ma rispondere all'output con più input. Se finisci per costruire il tuo sistema, vale la pena esaminarlo.

C'è anche una reimplementazione python di expect chiamata pexpect. Possono anche essere disponibili alcune interfacce dirette alla libreria prevista. Non sono un pitone quindi non potrei dirti molto di loro.

1

So che questa domanda è vecchia, ma visto che stavo cercando una risposta, ho pensato di aggiungere la mia per chiunque altro accada.

dichiarazione di non responsabilità completa: il progetto che sto di nota è mia, ma è completamente gratuito ed open source.

Mi sono imbattuto in un problema molto simile e ho finito con il rollare il mio solution.Il codice di test sarà simile a questa:

from CLITest import CLITest, TestSuite 
from subprocess import CalledProcessError 


class TestEchoPrintsToScreen(CLITest): 
    '''Tests whether the string passed in is the string 
    passed out''' 

    def test_output_contains_input(self): 
     self.assertNotIsInstance(self.output, CalledProcessError) 
     self.assertIn("test", self.output) 

    def test_ouput_equals_input(self): 
     self.assertNotIsInstance(self.output, CalledProcessError) 
     self.assertEqual("test", self.output) 

suite = TestSuite() 

suite.add_test(TestEchoPrintsToScreen("echo test")) 

suite.run_tests() 

questo ha funzionato abbastanza bene per ottenere me attraverso i miei problemi, ma so che potrebbe usare un po 'di lavoro per renderlo più robusto possibile (molle scoperta di prova in mente). Potrebbe essere d'aiuto, e io amo sempre una buona richiesta di attrazione.

Problemi correlati