Avant de commencer à exécuter les tests de mon projet python, je lis des variables d’environnement et les définit avec des valeurs lues. Mes tests seront exécutés sur l'environnement souhaité en fonction de ces valeurs lues.
par exemple: supposons que les variables d'environnement s'appellent "ENV_NAME" et "ENV_NUMBER"
Maintenant, je voudrais exécuter les tests en utilisant py.test
Si je code en dur ces variables d’environnement, par exemple: ENV_NAME = 'staging', ENV_NUMBER = '5' dans mon code puis exécutez les tests en exécutant la commande py.test à la racine du répertoire du projet, tous les tests sont exécutés avec succès .
Mais, je ne veux pas coder en dur ces valeurs. Existe-t-il un moyen d'envoyer des variables d'environnement en tant qu'arguments de ligne de commande pour py.test?
Je pensais plus dans les lignes de
py.test -ENV_NAME = 'staging' -ENV_NUMBER = '5'. Mais ça ne fonctionne pas.
S'il vous plaît aider! Je vous remercie!
J'ai finalement trouvé la réponse que je cherchais.
nous pouvons définir les variables d'environnement comme ceci avant d'exécuter des tests à l'aide de py.test
ENV_NAME = 'staging' ENV_NUMBER = '5' py.test
Une autre alternative consiste à utiliser le plugin pytest-env . Il peut être configuré comme suit:
[pytest]
env =
HOME=~/tmp
D:RUN_ENV=test
le préfixe D:
permet de définir une valeur par défaut et de ne pas remplacer les variables existantes transmises à py.test
.
Note: vous pouvez exécuter explicitement pytest avec une configuration personnalisée, si vous n'avez parfois besoin que d'exécuter un environnement spécialisé configuré:
pytest -c custom_pytest.ini
Vous pouvez y parvenir de plusieurs manières.
1) Si vous ne voulez pas utiliser la variable d'environnement, vous pouvez utiliser pytest addoptions en tant que https://pytest.org/latest/example/simple.html
2) Vous pouvez écrire un script comme celui-ci pour appeler des variables d’environnement.
import os
import py
env_name = os.environ["ENV_NAME"]
env_no = os.environ["ENV_NUMBER"]
pytest_args=(env_name,env_no)
pytest.main('-s' ,pytest_args,test_file.py)
dans test_fichier.py vous pouvez utiliser
env_n, env_n = pytest.config.getoption('pytest_args')
3) Autre méthode si vous voulez juste passer la variable d’environnement de la date non définie
en ligne de commande, vous pouvez l'utiliser comme
py.test --testdata ="ENV_NAME:staging,ENV_NUMBER:5"
Vous pouvez utiliser dans votre fichier de test
pytest_params = pytest.config.getoption('testdata')
params = pytest_params.split(":")
param_dict = dict(params[i:i+2] for i in range(0,len(params),2))
env_name = param_dict["ENV_Name"]
En plus d'autres réponses. Il existe une option pour remplacer pytest_generate_tests
dans conftest.py
et y définir des variables ENV.
Par exemple, ajoutez ce qui suit dans conftest.py
:
import os
def pytest_generate_tests(metafunc):
os.environ['TEST_NAME'] = 'My super test name| Python version {}'.format(python_version)
Ce code vous permettra de saisir la variable TEST_NAME
ENV dans votre application de test. Aussi, vous faites un montage froid:
import os
import pytest
@pytest.fucture
def the_name():
return os.environ.get('TEST_NAME')
En outre, cette variable ENV sera disponible dans votre application.
1 . J'utilise singe patch lorsque je ne charge pas de variable d'environnement en dehors de la fonction.
import os
# success.py
def hello_world():
return os.environ["HELLO"]
# fail.py
global_ref = os.environ["HELLO"] # KeyError occurs this line because getting environment variable before monkeypatching
def hello_world():
return global_ref
# test.py
def test_hello_world(monkeypatch):
# Setup
envs = {
'HELLO': 'world'
}
monkeypatch.setattr(os, 'environ', envs)
# Test
result = hello_world()
# Verify
assert(result == 'world')