2017-08-22 1 views
0

Je suis confronté à un petit problème avec les luminaires pytest, j'apprécierais votre aide.Fixation Py.test: Utiliser la fixation dans le luminaire

J'ai quelques appareils fonctionnels comme mentionné ci-dessous. pour simplifier je n'ai pas montré la mise en œuvre.

@pytest.fixture() 
def get_driver(): 
    pass 

@pytest.fixture() 
def login(get_driver): 
    pass 

@pytest.fixture() 
def settings(login): 
    pass 

le problème est que je besoin d'un appareil plus (niveau de la session) qui fait la configuration avant que je lance mon premier test. (réellement commencer à tester). c'est-à-dire aller à la page des paramètres et créer quelques paramètres. (après la connexion)

maintenant le problème est que je ne peux pas faire comme cela en utilisant fixation de niveau de session, car je ne peux pas utiliser l'appareil au niveau de la fonction au niveau de la session. ou puis-je?

@pytest.fixture(scope="session") 
def setup(settings): 
    settings.create_settings() 
    pass 
+1

La documentation indique «non». L'appareil au niveau de la fonction peut utiliser ceux de niveau session mais pas l'inverse. Je suppose que vous devez ajouter plus de détails à votre situation afin que nous puissions être en mesure de trouver une solution de contournement à votre problème. – ldiary

+0

le problème est que j'ai besoin d'un luminaire supplémentaire qui n'est appelé qu'une seule fois avant le premier test. (session ou module). Cependant, le problème est que je ne peux pas utiliser le paramètre 'settings' qui a toutes les fonctions liées à la création de' data for test' dans cet appareil. –

+1

Votre 'get_driver' est un appareil de niveau fonction, cela signifie-t-il que vous créez une nouvelle instance du' driver' pour chaque fonction de test? Ou vous récupérez simplement la même instance de 'driver' que vous utiliserez dans votre installation' setup' de votre session? – ldiary

Répondre

1

Vous devrez utiliser une solution de contournement. L'action doit être effectuée dans un appareil de portée function avec autouse réglé sur True.

Vous devez initialiser une variable dans l'unité session, qui vérifie si les settings ont été effectuées ou non. Sinon fait, vous allez faire les réglages et changer le drapeau False

Ci-dessous un exemple de travail

import pytest 


@pytest.fixture(scope="session", autouse=True) 
def settings_page(): 
    config = {"config_done": False} 
    return config 


@pytest.fixture() 
def init(request): 
    print("init called") 
    return "init" 


@pytest.fixture() 
def driver(): 
    print("driver called") 

    return "driver" 


@pytest.fixture(autouse=True) 
def init_settings(settings_page, driver): 
    if not settings_page["config_done"]: 
     print("Settings being done only the first time") 
     settings_page["config_done"] = True 


@pytest.fixture() 
def login(): 
    print("login called") 
    return "login" 


@pytest.fixture() 
def logged_in_driver(init, driver, login): 
    print("logged in driver is ready") 
    return (init, driver, login) 


@pytest.fixture() 
def non_logged_in_driver(init, driver): 
    print("non logged in driver is ready") 
    return (init, driver) 


def test_1(logged_in_driver): 
    print("test_1") 


def test_2(non_logged_in_driver): 
    print("test_2") 

sortie est comme ci-dessous

test.py driver called 
Settings being done only the first time 
init called 
login called 
logged in driver is ready 
.test_1 
driver called 
init called 
non logged in driver is ready 
.test_2 

Vous pouvez voir les paramètres ne se produit

+0

c'est ce que je suis en train de faire, la tête est pour chaque test, il vérifie si le réglage est fait ou non.Je pensais s'il y avait une autre meilleure façon de le faire –

+0

Vous pensez que la vérification d'un vrai ou faux est un overhead? Il pourrait ajouter quelques ms au total à votre suite entière et ceux-ci ne devraient pas importer –

0

Cette solution de contournement tente d'obtenir le même résultat sans créer d'unité de niveau de session. Il répond à votre besoin d'un paramètre called only once before first test case comme vous l'avez mentionné dans votre commentaire ci-dessus.

Créer une conftest.py et placer le contenu suivant:

import pytest 


def pytest_sessionstart(session): 
    print("Initialising Session Level Settings") 
    login = "A specialized login" 
    settings(login).create_settings() 


@pytest.fixture() 
def get_driver(): 
    print("Get Driver") 


@pytest.fixture() 
def login(get_driver): 
    print("Login") 


@pytest.fixture() 
def settings(login): 
    print("Settings") 

    class Setter: 
     def create_settings(self): 
      print("[Success] Settings created!") 
    return Setter() 

Vous pouvez ensuite utiliser dans votre test comme ci-dessous:

def test_one(settings): 
    print("Test one...") 


def test_two(settings): 
    print("Test two...") 

exécution du test devrait donner un effet à ce que vous vouliez (basé sur ce que je peux déduire de vos informations données jusqu'à présent).

(py362) D:\repo\git\ens_qa>py.test -sv stackoverflow\ScopeWorkaroundTests.py 
Initialising Session Level Settings 
Settings 
[Success] Settings created! 
============================= test session starts ============================= 
platform win32 -- Python 3.6.2, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 -- d:\virtualenv\py362\scripts\python.exe 
cachedir: .cache 
rootdir: D:\repo\git\ens_qa, inifile: 
collected 2 items 

stackoverflow/ScopeWorkaroundTests.py::test_one Get Driver 
Login 
Settings 
Test one... 
PASSED 
stackoverflow/ScopeWorkaroundTests.py::test_two Get Driver 
Login 
Settings 
Test two... 
PASSED 

========================== 2 passed in 0.05 seconds =========================== 

(py362) D:\repo\git\ens_qa>