2017-08-22 4 views
0

J'apprends des tests paramétrés avec pyest. Après avoir suivi the relevant pytest documentation, je suis venu avec cet exemple simple:Paramétrisation des tests avec 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') 

Cela donne l'erreur suivante:

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

ligne 7 est def foo(request):.

Quelle est la cause de cette erreur et comment la réparer?

+0

J'utilise normalement '@ pytest.mark.parametrise (» request ', [' foo ',' bar ']) '. Il ne répond pas à votre question, mais il pourrait fonctionner comme une solution rapide (où 'request' est le nom de l'argument) – Artyer

+0

@Artyer Merci pour la suggestion. Les documents que je lie n'ont pas ceci, donc je suis toujours intéressé à apprendre ce que je fais mal. –

+0

Je pense que le problème est comme mentionné dans l'erreur, vous n'avez pas défini le paramètre, comme l'a dit @Artyer dans son exemple, il nomme "demande" et transmet ensuite les valeurs. Dans votre code, vous passez à la fonction foo l'argument request mais il n'y a pas de paramètre car vous ne définissez pas à l'intérieur de l'appareil –

Répondre

1

Le but des fixtures est de passer des objets aux cas de test, mais le luminaire que vous avez créé ne retourne rien ou ne rapporte rien. Puis je ne suis pas sûr que vous pouvez passer des objets à une méthode TestCase unittest, je pense que cela peut créer des conflits avec le paramètre self.

De l'autre côté, il peut fonctionner avec une fonction simple:

@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:

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

+0

J'ai réécrit mes tests unittest dans pytest. Merci pour le lien qui m'a incité à aller dans cette direction. –