web-dev-qa-db-fra.com

Créez et importez des fonctions d'assistance dans les tests sans créer de packages dans le répertoire test à l'aide de py.test

Question

Comment puis-je importer des fonctions auxiliaires dans des fichiers de test sans créer de packages dans le répertoire test?


Le contexte

J'aimerais créer une fonction d'aide au test que je peux importer dans plusieurs tests. Dis quelque chose comme ça:

# In common_file.py

def assert_a_general_property_between(x, y):
    # test a specific relationship between x and y
    assert ...


# In test/my_test.py

def test_something_with(x):
    some_value = some_function_of_(x)
    assert_a_general_property_between(x, some_value)

(Utilisant Python 3.5, avec py.test 2.8.2} _


"Solution" actuelle

Je le fais actuellement en important un module dans le répertoire test de mon projet (qui est maintenant un paquet), mais j'aimerais le faire avec un autre mécanisme si possible (pour que mon répertoire test ne contienne pas de paquet, mais seulement tests, et les tests peuvent être exécutés sur une version installée du paquet, comme recommandé ici, dans la documentation de bonnes pratiques de py.test ).

29
Juan Carlos Coto

En cherchant une solution à ce problème, je suis tombé sur cette question SO et j'ai finalement adopté la même approche. Créer un paquet d'aide, assembler sys.path pour le rendre importable puis l'importer ...

Cela ne semblait pas être la meilleure approche. J'ai donc créé pytest-helpers-namespace . Ce plugin vous permet d’enregistrer des fonctions d’aide sur votre conftest.py:

import pytest

pytest_plugins = ['helpers_namespace']

@pytest.helpers.register
def my_custom_assert_helper(blah):
    assert blah

# One can even specify a custom name for the helper
@pytest.helpers.register(name='assertme')
def my_custom_assert_helper_2(blah):
    assert blah

# And even namespace helpers
@pytest.helpers.asserts.register(name='me')
def my_custom_assert_helper_3(blah):
    assert blah

Et puis, dans un corps de fonction de cas de test, utilisez-le simplement comme 

def test_this():
    assert pytest.helpers.my_custom_assert_helper(blah) 

def test_this_2():
    assert pytest.helpers.assertme(blah)

def test_this_3():
    assert pytest.helpers.asserts.me(blah)

C'est assez simple et la documentation plutôt petite. Jetez un coup d'oeil et dites-moi si cela règle également votre problème.

14
s0undt3ch

Vous pouvez définir une classe d'assistance dans conftest.py, puis créer un appareil qui renvoie cette classe (ou une instance de celle-ci, selon vos besoins).

import pytest


class Helpers:
    @staticmethod
    def help_me():
        return "no"


@pytest.fixture
def helpers():
    return Helpers

Ensuite, dans vos tests, vous pouvez utiliser le fixture:

def test_with_help(helpers):
    helpers.help_me()
11
augurar

Pour accéder à une méthode à partir de différents modules sans créer de packages et pour que cette fonction fonctionne comme une fonction d'assistance, j'ai trouvé les informations suivantes utiles:

conftest.py:

@pytest.fixture
def compare_test_vs_actual():
    def a_function(test, actual):
        print(test, actual)
    return a_function

test_fichier.py:

def test_service_command_add(compare_test_vs_actual):
    compare_test_vs_actual("hello", "world")
3
tknightowl

Créez un package de helpers dans le dossier tests: tests/ helpers/ __init__.py utils.py ... # make sure no __init__.py in here! setup.cfg

dans setup.cfg: [pytest] norecursedirs=tests/helpers

les aides seront disponibles avec import helpers.

0
guyskk