2013-09-28 4 views
8

Ich bin neu in Python und versuche etwas zu tun, was ich oft in Ruby mache. Nämlich über eine Reihe von Indizes zu iterieren, sie als Argument für die Funktion zu verwenden und ihre Ergebnisse mit einem Array von Fixture-Ausgaben zu vergleichen.Wie führe ich mehrere Python-Testfälle in einer Schleife aus?

Also schrieb ich es wie ich normalerweise in Ruby, aber dies führte zu nur einem Testfall.

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

Ich versuche, den Test für jedes Element in der Reihe zu bekommen. Wie kann ich das machen?

+1

Haben Sie 10 verschiedene Testfälle generieren möchten? Der Code, den Sie gezeigt haben, funktioniert, er macht nur alle zehn Assertions in einem Testfall. – delnan

Antwort

8

Mit Unittest können Sie den Unterschied zwischen zwei Sequenzen in einem Testfall anzeigen.

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

Wenn das nicht flexibel genug ist, mit Unittest, ist es möglich, mehrere Tests zu erzeugen, aber es ist ein bisschen schwierig.

Nase macht das obige einfacher durch test generators.

import nose.tools 

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

ähnliche Fragen:

+1

Das macht Sinn, danke für die Erklärung. Ich werde es aktualisieren. –

+0

Wahrscheinlich sollte die Testmethodengenerierung nicht in die Klausel if __name__ == '__main__' eingefügt werden, da sie das Modul ändert. Der Testsequenzcode ist ohne den Generierungscode nicht sinnvoll. –

+1

Guter Punkt @JappieKerk, ich habe die Klausel entfernt. –

5

In Python Welt zwei beliebtestene Optionen Tests zu schreiben sind:

In pytest parametrisieren Sie Tests sehr easly: ​​

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

Dies wird auch schöne Ausgabe produzieren, während Tests ausgeführt werden:

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

I pytest seit zwei Jahren bin mit jetzt und es ist ein sehr nettes Werkzeug. Sie haben dort viele Funktionen. Neben der Parametrisierung gibt es auch Fixtures, sehr sehr nette Assertions (du musst kein assertEqual schreiben, nur assert a==b und pytest kann sehr schöne und hilfreiche Ausgaben erzeugen.)

Verwandte Themen