[PYTHON] Faire de fixture un argument à paramétrer dans py.test

introduction

L'appareil pytest est un outil très utile lorsque vous souhaitez répéter le test dans les mêmes conditions. Lorsque je voulais utiliser fixture comme paramètre de test afin d'écrire un test commun à diverses conditions, les informations n'étaient pas rassemblées de manière inattendue sur le net, je vais donc les décrire ici.

Au fait, pour savoir comment utiliser fixture comme paramètre de test, voir Official Page et GitHub. / pytest-dev / pytest / issues / 349), il est donc possible qu'une méthode un peu plus simple soit fournie dans un proche avenir.

Chose que tu veux faire

import pytest

@pytest.fixture
def fixture_a():
    yield 1

@pytest.fixture
def fixture_b():
    yield 2

@pytest.fixture
def fixture_c():
    yield 3

@pytest.mark.parametrize("expected, generated", [
        (1, fixture_a),
        (2, fixture_b),
        (5, fixture_c),
])
def test_fail(expected, generated):
    assert expected == generated

Cependant, cela ne fonctionne pas.

Alternative

Assemblez les luminaires en utilisant le décorateur pytest.fixture.

test.py


#Les autres fonctions sont les mêmes que ci-dessus

@pytest.fixture(params=['a', 'b', 'c'])
def context(request):
    if request.param == 'a':
        return (1, request.getfixturevalue('fixture_a'))
    elif request.param == 'b':
        return (2, request.getfixturevalue('fixture_b'))
    elif request.param == 'c':
        return (4, request.getfixturevalue('fixture_c'))

def test_fixture_parameterize(context):
    expected, generated = context
    assert expected == generated
$ pytest test.py
========================================= test session starts =========================================
platform linux2 -- Python 2.7.12, pytest-3.1.0, py-1.4.33, pluggy-0.4.0
rootdir: /home/koreyou/work/pytest_fixture_parameterize, inifile:
collected 3 items 

test.py ..F

============================================== FAILURES ===============================================
____________________________________ test_fixture_parameterize[c] _____________________________________

context = (4, 3)

    def test_fixture_parameterize(context):
        expected, generated = context
>       assert expected == generated
E       assert 4 == 3

test.py:31: AssertionError
================================= 1 failed, 2 passed in 0.02 seconds ==================================

Il échoue comme prévu.

Recommended Posts

Faire de fixture un argument à paramétrer dans py.test
Comment créer un outil CLI interactif avec Golang
Une alternative à `pause` en Python
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Je veux faire un programme d'automatisation!
Comment créer un pilote de périphérique Linux intégré (11)
Comment créer un pilote de périphérique Linux intégré (1)
Comment créer un pilote de périphérique Linux intégré (4)
Comment créer un pilote de périphérique Linux intégré (7)
Comment créer un pilote de périphérique Linux intégré (3)
Comment créer un pilote de périphérique Linux intégré (6)
Comment créer un pilote de périphérique Linux intégré (5)
Comment créer un pilote de périphérique Linux intégré (10)
Comment apporter des modifications à l'interpréteur Python dans Pycharm
Comment se moquer d'une fonction publique dans Pytest
Comment créer un pilote de périphérique Linux intégré (9)
Un outil pour créer des images de masque pour ETC en Python
Essayez de créer un module Python en langage C
Faire de chaque page PowerPoint un fichier image en Python
Comment faire reconnaître Yubico Yubikey par Manjaro Linux
Expliquez en détail comment créer un son avec python
Comment créer un serveur HTTPS avec Go / Gin
Comment créer un téléchargeur d'image avec Bottle (Python)
Comment créer un pilote de périphérique Linux intégré (12) (Terminé)
Comment utiliser Decorator dans Django et comment le créer
J'ai essayé de créer une application OCR avec PySimpleGUI
Comment spécifier un nombre infini de tolérances dans le contrôle de validation d'argument numérique d'argparse
Si vous voulez mettre un argument dans la fonction de fermeture et l'exécuter plus tard