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 ).
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.
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()
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")
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
.