2016-02-22 24 views
10

Attualmente sto seguendo questo esempio py.test e funziona quando non uso le classi, tuttavia quando introduco casi di test in classi che non riesco.Py.test: parametrizza i casi di test dalle classi

Il caso più piccolo sono riuscito a scrivere è il seguente:

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) 

purtroppo quando eseguo

py.test test_suite.py 

ricevo il seguente messaggio di errore:

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

Come posso fare per generare una batteria di test_1 test?

+1

La vostra esigenza di classe di essere una sottoclasse di 'TestCase'? –

+0

Attualmente, non è obbligatorio, ciò di cui ho bisogno è di parametrizzare test che sono definiti in una classe – pafede2

+1

Come per i test parametrizzati che i metodi 'TestCase', la risposta a questa domanda precedente sembra essere ancora valida: http: // stackoverflow. it/questions/18182251/does-pytest-parametrized-test-work-with-unittest-based-tests-test In breve: il mixaggio dei due concetti non funzionerà. –

risposta

8

Se si sottoclasse da unittest.TestCase, i metodi di test non possono avere argomenti aggiuntivi. Se semplicemente sottoclasse da object, che funzionerà (anche se dovrete usare regolari assert dichiarazioni invece dei metodi 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 

A quel punto, però, che tipo di porta a chiedersi perché si sta utilizzando classi invece di limitarsi a definire funzioni, poiché il test sarà essenzialmente lo stesso, ma richiede meno codice e codice generale

+0

Questa proposta funziona ma pytest non identifica alcun test. Stampa la legenda "raccolto 0 articoli". Qualche suggerimento? – pafede2

+0

Mi spiace, volevo anche indicare che il nome della classe deve iniziare con 'Test' e pytest lo può raccogliere. –

+0

Ho appena accettato la risposta, tuttavia mi chiedevo se ci sarebbe stata anche un'opzione quando la classe erediterebbe da unittest.TestCase? – pafede2

0

Infine e considerando la risposta di @Brendan Abel e commenti sono riuscito a riuscire in quello che dovevo fare facendo:

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) 

allora io sono in grado di eseguire i test dal comando nosetests:

nosetests -v --with-id class.py 
Problemi correlati