2013-09-28 17 views
8

Jestem nowy w Pythonie i próbuję zrobić coś, co robię często w Ruby. Mianowicie, iteracja na zestawie wskaźników, wykorzystanie ich jako argumentów do funkcji i porównanie jej wyników z tablicą wyników urządzeń.Jak uruchomić wiele przypadków testowych Pythona w pętli?

Więc napisałem to tak, jak normalnie robię w Ruby, ale zaowocowało to tylko jednym przypadkiem testowym.

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

Próbuję uzyskać test dla każdego przedmiotu w zakresie. Jak mogę to zrobić?

+1

Czy chcesz wygenerować 10 różnych testów? Pokazany kod działa, po prostu wykonuje wszystkie dziesięć twierdzeń w jednym przypadku testowym. – delnan

Odpowiedz

8

Korzystając z unittest, możesz pokazać różnicę między dwiema sekwencjami w jednym przypadku testowym.

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

Jeśli to nie jest wystarczająco elastyczny, przy użyciu unittest, możliwe jest generowanie wielu testów, ale jest to trochę skomplikowane.

Nos ułatwia powyższe poprzez test generators.

import nose.tools 

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

Podobne pytania:

+1

To ma sens, dzięki za wyjaśnienie. Będę go zaktualizować. –

+0

Prawdopodobnie nie powinno się generować metody testowej w klauzuli if __name__ == '__main__', ponieważ modyfikuje ona moduł. Kod sekwencji testu nie ma sensu bez kodu generującego. –

+1

Dobry punkt @JappieKerk, usunąłem klauzulę. –

5

w Pythonie świecie dwóch najbardziej popularnych opcji do pisania testów są:

W pytest ty parametrize testy bardzo easly: ​​

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

To będzie produkować ładne wyjście również podczas uruchamiania testów:

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

używam pytest przez dwa lata teraz i jest to bardzo dobre narzędzie. Masz wiele funkcji. Oprócz parametryzacji znajdują się także urządzenia, bardzo ładne asercje (nie musisz pisać assertEqual, tylko assert a==b i pytest może wygenerować dla niego bardzo ładne i pomocne wyjście).

Powiązane problemy