2016-02-22 6 views
10

Ich bin derzeit nach diesem py.test Beispiel und es funktioniert, wenn ich keine Klassen verwende, aber wenn ich Testfälle in Klassen einführe, scheitere ich.Py.test: Testfälle von Klassen parametrisieren

Der kleinste Fall I ist folgendes zu schreiben verwaltet:

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) 

leider, wenn ich

py.test test_suite.py 

ich Nachricht erhalten den Fehler ausführen:

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

Wie kann ich tun um eine Batterie von test_1 Tests zu generieren?

+1

Hat Ihre Klasse Bedarf eine Unterklasse von 'TestCase' zu ​​sein? –

+0

Derzeit ist es nicht obligatorisch, was ich brauche ist, Tests zu parametrisieren, die in einer Klasse definiert sind – pafede2

+1

Wie für parametrisierte Tests, die 'TestCase' Methoden, scheint die Antwort auf diese ältere Frage immer noch gültig: http: // stackoverflow. com/questions/18182251/does-pytest-parametrisierte-test-arbeit-mit-unittest-klassenbasierte tests Kurz gesagt: das Mischen der beiden Konzepte wird nicht funktionieren. –

Antwort

8

Wenn Sie eine Unterklasse von unittest.TestCase erstellen, können Ihre Testmethoden keine zusätzlichen Argumente haben. Wenn Sie einfach aus object Unterklasse, funktioniert es (obwohl Sie regelmäßig assert Aussagen anstelle der TestCase.assertEqual Methoden verwenden werden müssen.

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 

An diesem Punkt aber es stellt sich Art die Frage, warum Sie verwenden Klassen statt nur Funktionen zu definieren, da der Test im Wesentlichen der gleiche sein wird, aber insgesamt weniger Vortex und Code benötigen

+0

Dieser Vorschlag funktioniert, aber pytest identifiziert keinen Test. Es druckt die Legende "sammelte 0 Gegenstände" aus. Irgendein Vorschlag? – pafede2

+0

Entschuldigung, ich wollte auch anzeigen, dass der Klassenname mit 'Test' beginnen muss, damit pytest es aufheben kann. –

+0

Ich habe gerade die Antwort akzeptiert, aber ich habe mich gefragt, ob es auch eine Option geben würde, wenn die Klasse von unittest.TestCase erbt? – pafede2

0

Schließlich und in Anbetracht der Antwort von @ Brendan Abel und Kommentare gelang es mir, in dem, was ich beabsichtigt war, zu erreichen dabei:

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) 
Dann

Ich bin in der Lage, die Tests durch den nosetests Befehl auszuführen:

nosetests -v --with-id class.py