2017-08-22 9 views
0

Ich lerne über parametrisierte Tests mit Pyest. Nach dem folgenden the relevant pytest documentation kam ich mit diesem einfachen Beispiel folgenden:Parametrierung von Tests mit Pytest

import unittest 

import pytest 


@pytest.fixture(autouse=True, params=['foo', 'bar']) 
def foo(request): 
    print('fixture') 
    print(request.param) 


class Foo(unittest.TestCase): 
    def setUp(self): 
     print('unittest setUp()') 

    def test(self): 
     print('test') 

Dies wird folgenden Fehler gibt:

Failed: The requested fixture has no parameter defined for the current test. 
E    
E    Requested fixture 'foo' defined in: 
E    tests/fixture.py:7 

Linie 7 def foo(request): ist.

Was verursacht diesen Fehler und wie behebe ich ihn?

+0

ich normalerweise '@ pytest.mark.parametrise verwenden (‘ Anfrage ', [' foo ',' bar ']) '. Es beantwortet Ihre Frage nicht, aber es könnte als eine schnelle Lösung funktionieren (Wo 'Anfrage' ist der Name des Arguments) – Artyer

+0

@Artyer Danke für den Vorschlag. Die Dokumente, die ich verlinke, haben das nicht, also bin ich immer noch daran interessiert zu lernen, was ich falsch mache. –

+0

Ich denke, das Problem ist wie es in dem Fehler erwähnt, Sie haben den Parameter nicht definiert, wie @Artyer in seinem Beispiel sagte, er nennt "Anfrage" und dann die Werte übergeben. In Ihrem Code übergeben Sie an die foo-Funktion das Anfrage-Argument, aber es gibt keinen Parameter, den Sie nicht innerhalb des Fixtures definieren. –

Antwort

1

Das Ziel von Fixtures ist es, Objekte an die Testfälle zu übergeben, aber die Fixture, die Sie gemacht haben, gibt nichts zurück oder liefert nichts.

Dann bin ich mir nicht sicher, ob Sie Objekte an eine unittest TestCase-Methode übergeben können, ich denke, dass es einige Konflikte mit dem Selbstparameter verursachen kann.

Auf der anderen Seite, kann es mit einer einfachen Funktion arbeiten:

@pytest.fixture(autouse=True, params=['foo', 'bar']) 
def foo(request): 
    print('fixture') 
    print(request.param) 
    yield request.param 

# class Foo(unittest.TestCase): 
#  def setUp(self): 
#   print('unittest setUp()') 
# 
#  def _test(self): 
#   print('test') 

def test_fixture(foo): 
    assert foo == 'foo' 

>>> 1 failed, 1 passed in 0.05 seconds 
# test 1 run with foo : OK 
# test 2 run with bar : FAILED 

EDIT:

Tat: Why cant unittest.TestCases see my py.test fixtures?

+0

Ich schrieb meine Komponententests in pytest um. Danke für den Link, der mich dazu bewogen hat, in diese Richtung zu gehen. –

Verwandte Themen