2016-02-22 20 views
10

Obecnie śledzę ten przykład py.test i działa, gdy nie używam klas, jednak gdy wprowadzam przypadki testowe na zajęcia, nie jestem w stanie.Py.test: parametrize przypadki testowe z klas

Najmniejszy przypadek udało mi się napisać to:

import unittest 

import pytest 

class FixtureTestCase(unittest.TestCase): 

    @pytest.mark.parametrize("test_input,expected", [ 
    ("3+5", 8), 
    ("2+4", 6), 
    ("6*9", 42), 
    ]) 
    def test_1(self, a, b): 
     self.assertEqual(a, b) 

niestety kiedy wykonać

py.test test_suite.py 

otrzymuję komunikat o błędzie:

TypeError: test_1() takes exactly 3 arguments (1 given) 

Jak mogę zrobić w celu wygenerowania baterii testów test_1?

+1

Czy Twoja klasa trzeba być podklasą 'TestCase'? –

+0

Obecnie nie jest to obowiązkowe, potrzebuję sparametryzować testy, które są zdefiniowane w klasie – pafede2

+1

Jeśli chodzi o sparametryzowane testy, metody "TestCase", odpowiedź na to starsze pytanie wydaje się nadal aktualna: http: // stackoverflow. com/questions/18182251/does-pytest-parametrized-test-work-with-unittest-class-based-tests W skrócie: mieszanie dwóch koncepcji nie będzie działać. –

Odpowiedz

8

Jeśli masz podklasę od unittest.TestCase, twoje metody testowe nie mogą zawierać dodatkowych argumentów. Jeśli po prostu podklasy z object, to będzie działać (choć będziesz musiał używać zwykłych assert oświadczenia zamiast metod TestCase.assertEqual.

import unittest 

import pytest 

class TestCase(object): 

    @pytest.mark.parametrize("test_input,expected", [ 
    ("3+5", 8), 
    ("2+4", 6), 
    ("6*9", 42), 
    ]) 
    def test_1(self, a, b): 
     assert eval(a) == b 

W tym momencie jednak, że rodzaj Nasuwa się pytanie, dlaczego używasz klasy, a nie tylko definiowanie funkcji, ponieważ test będzie zasadniczo taki sam, ale wymagać będzie mniej ogólnego zestawu znaków i kodu

+0

Ta propozycja działa, ale pytest nie identyfikuje żadnego testu. Wydrukowano legendę "zebrano 0 przedmiotów". Jakieś sugestie? – pafede2

+0

Przepraszam, chciałem również wskazać, że nazwa klasy musi zaczynać się od 'Test', a także, aby go odebrać. –

+0

Właśnie przyjąłem odpowiedź, ale zastanawiałem się, czy istnieje opcja, gdy klasa dziedziczy z unittest.TestCase? – pafede2

0

Wreszcie i biorąc pod uwagę odpowiedź @Brendana Abla i komentarze, udało mi się odnieść sukces w tym, co zamierzałem zrobić wykonując:

class TestCase(object): 

    @parameterized.expand([ 
    ("negative", -1.5, -2.0), 
    ("integer", 1, 1.0), 
    ("large fraction", 1.6, 1), 
    ]) 
    def test_floor(self, name, input, expected): 
     assert_equal(math.floor(input), expected) 


    @parameterized.expand([ 
    ("3+5", 8), 
    ("2+4", 6), 
    ("6*9", 42), 
    ]) 
    def test_1(self, a, b): 
     assert_equal(eval(a), b) 

Wtedy jestem w stanie wykonać testy przez komendę nosetests:

nosetests -v --with-id class.py 
Powiązane problemy