2012-02-24 21 views
6

Pracuję na zestaw testów jednostkowych Pythona, które są obecnie zbudowane przy użyciu pytony zbudowane w ramach testowania. Chciałbym napisać testy paramaterialne, które będą wykonywane wielokrotnie na podstawie zestawu danych, które mu podaję.Paramaterize testy jednostkowe w python

tj. jeśli mój zestaw danych to [1,2,3,4], moja funkcja testowa działałaby czterokrotnie przy użyciu danych wejściowych w moim zbiorze danych.

def test(data): 
    if data > 0: 
     #Pass the test 

Z mojego zrozumienia nie jest to obecnie możliwe w ramach wbudowanej, chyba że ustawię pętlę w mojej funkcji testowej. Nie chcę tego robić, ponieważ potrzebuję testu, aby kontynuować wykonywanie, nawet jeśli jedno wejście nie powiedzie się.

Widziałem, że można to zrobić za pomocą nosa lub pyTestu. Który jest najlepszy framework do użycia? Czy istnieją inne ramy, które mogłem wykorzystać, które byłyby lepsze niż którekolwiek z nich?

Z góry dziękuję!

Odpowiedz

6

Należy zauważyć, że jest to jedno z najczęstszych zastosowań niedawnego dodania funcargs w py.test.

W twoim przypadku można dostać:

def pytest_generate_tests(metafunc): 
    if 'data' in metafunc.funcargnames: 
     metafunc.parametrize('data', [1,2,3,4]) 

def test_data(data): 
    assert data > 0 

[EDIT] Powinienem chyba dodać, że można również zrobić tak prosto jak

@pytest.mark.parametrize('data', [1,2,3,4]) 
def test_data(data): 
    assert data > 0 

Więc powiedziałbym, że py .test to doskonała platforma do sparametryzowanych testów jednostkowych ...

1

Można tworzyć testy dynamicznie na podstawie danych zawartych w następujący sposób:

import unittest 

data_set = [1,2,3,4] 

class TestFunctions(unittest.TestCase): 
    pass # all your non-dynamic tests here as normal 

for i in data_set: 
    test_name = "test_number_%s" % i # a valid unittest test name starting with "test_" 
    def dynamic_test(self, i=i): 
     self.assertTrue(i % 2) 
    setattr(TestFunctions, test_name, dynamic_test) 

if __name__ == '__main__': 
    unittest.main() 

Pytanie Python unittest: Generate multiple tests programmatically? ma większą dyskusję o tym, w tym another approach że osiąga to samo dynamicznie tworzenie wielu wystąpień testu przejdź do zestawu testów.