2013-09-28 15 views
8

Sono nuovo di Python e sto provando a fare qualcosa che faccio spesso in Ruby. Vale a dire, iterando su un insieme di indici, usandoli come argomento per funzionare e confrontando i suoi risultati con una serie di output di fixture.Come si eseguono più test case Python in un ciclo?

Quindi l'ho scritto come faccio normalmente in Ruby, ma questo ha provocato un solo test case.

def test_output(self): 
    for i in range(1,11): 
     .... 
     self.assertEqual(fn(i),output[i]) 

Sto cercando di ottenere il test per ogni articolo della gamma. Come lo posso fare?

+1

vuoi generare 10 casi di test distinti? Il codice che hai mostrato funziona, fa tutte e dieci le asserzioni in un caso di test. – delnan

risposta

8

Utilizzando unittest è possibile mostrare la differenza tra due sequenze tutte in un caso di test.

seq1 = range(1, 11) 
seq2 = (fn(j) for j in seq1) 
assertSequenceEqual(seq1, seq2) 

Se questo non è abbastanza flessibile, utilizzando unittest, è possibile generare più test, ma è un po 'complicato.

Il naso semplifica quanto sopra tramite test generators.

import nose.tools 

def test_fn(): 
    for i in range(1, 11): 
     yield nose.tools.assert_equals, output[i], fn(i) 

domande simili:

+1

Questo ha senso, grazie per la spiegazione. Otterrò ad aggiornarlo. –

+0

Probabilmente non dovrebbe mettere la generazione del metodo di prova nella clausola if __name__ == '__main__' perché sta modificando il modulo. Il codice della sequenza di test non ha senso senza il codice di generazione. –

+1

Buon punto @ JappieKerk, ho rimosso la clausola. –

5

Nel mondo pitone due opzioni più popolari per scrivere test sono:

In pytest si parametrizzare test molto facilmente:

@pytest.mark.parametrize(('param1', 'param2'),[ 
         (1, 'go'), 
         (2, 'do not go')]) 
def test_me(param1, param2): 
    # write test 

Questo produrrà uscita bello anche durante l'esecuzione di test:

go.py:2: test_me[1-go] PASSED 
go.py:2: test_me[2-do not go] PASSED 

Sto usando pytest per due anni ora ed è uno strumento molto bello. Hai molte caratteristiche lì. Oltre alla parametrizzazione ci sono anche fixture, molto molto belle asserzioni (non è necessario scrivere assertEqual, solo assert a==b e pytest può generare output molto carino e utile per questo.)

Problemi correlati