2016-03-19 41 views
7

Na moim serwerze internetowym mam urządzenie login, które tworzy użytkownika i zwraca nagłówki potrzebne do wysyłania żądań. Do pewnego testu potrzebuję dwóch użytkowników. Jak mogę użyć tego samego urządzenia dwa razy w jednej funkcji?Pytest używa tej samej oprawy dwa razy w jednej funkcji

from test.fixtures import login 


class TestGroups(object): 

    def test_get_own_only(self, login, login): 
     pass 
+2

Ponieważ urządzenia są buforowane za funkcję, nie widzę łatwego sposobu, aby to zrobić. Domyślam się, że najlepszym rozwiązaniem byłoby posiadanie funkcji '_login', a następnie urządzenia' login1' i 'login2', które po prostu wykonują' return _login() 'lub tak. –

Odpowiedz

3

Alternatywą jest po prostu skopiowanie funkcji urządzenia. Jest to proste i poprawnie obsługuje sparametryzowane urządzenia, wywołując funkcję testową ze wszystkimi kombinacjami parametrów dla obu urządzeń. Poniżej przykład ten kod budzi 9 twierdzeń:

import pytest 

@pytest.fixture(params=[0, 1, 2]) 
def first(request): 
    return request.param 

second = first 

def test_double_fixture(first, second): 
    assert False, '{} {}'.format(first, second) 
2

Robię to z klasą Dummy, która zaimplementuje funkcjonalność urządzenia. Następnie po prostu zadzwoń do niego z testu. Podaj nazwę metody, aby lepiej zrozumieć, co robi twój test.

import pytest 

@pytest.fixture 
def login(): 
    class Dummy: 
     def make_user(self): 
      return 'New user name' 
    return Dummy() 

def test_something(login): 
    a = login.make_user() 
    b = login.make_user() 
    assert a == b 
0

potrzebowałem moich testów, aby bezpośrednio połączyć się z uchwytu, aby zastąpić dotychczasowy rezultat instancja, więc napisałem warstwę abstrakcji, która zawiera odnośniki do wszystkich moich lamp:

def call_fixture(fixture, session=''): 
    return { 
     'fixture_name': fixture_name(session), 
    }[fixture] 

wywoływana z (get_session jest inna oprawa)

call_fixture('fixture_name', get_session) 
0

I sporządzono tak:

limits = [10, 20, 30] 

@pytest.fixture(params=limits) 
def number(request): 
    return random.randint(request.param) 

@pytest.fixture(params=limits) 
def two_numbers(request): 
    return number(request), number(request) 

def test_numbers(two_numbers): 
    num_1, num_2 = two_numbers 
    ...