Сделаю из тебя крутого AQA инженера на Python.
• Преподаю лучшие тренинги по автоматизации тестирования API
• Senior Python developer | AQA lead, 7 лет в IT
Post #448
1.22K





Что делать, если авторизационный токен в тестах протухает очень быстро?
На одном из вебинаров мне задали такой вопрос. Наверняка есть множество вариантов решения этой проблемы, я поделюсь одним из них — не самым технически сложным и вполне понятным для поста в Telegram.
Постановка задачи:
Представим, что у нас есть HTTP-клиент, в котором требуется авторизация:
Нам необходимо сделать так, чтобы при отправке запроса send_request всегда использовался актуальный токен.
Решение:
Создадим клиент, который отвечает за получение актуального токена.
Он запускает фоновый поток для обновления токена и имеет публичный метод для получения актуального значения:
Теперь доработаем наш HTTP-клиент:
Чтобы проверить работу, подготовим простой тест:
Результат:
Итого:
Мы создали клиент, который на протяжении всей тестовой сессии актуализирует токен в отдельном потоке, не блокируя выполнение тестов. Доработали HTTP-клиент так, чтобы перед запросом он получал актуальный токен. В итоге наши тесты не развалятся, если токен протухнет в процессе их выполнения.
Ставь реакцию если понравился пост)
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
На одном из вебинаров мне задали такой вопрос. Наверняка есть множество вариантов решения этой проблемы, я поделюсь одним из них — не самым технически сложным и вполне понятным для поста в Telegram.
Постановка задачи:
Представим, что у нас есть HTTP-клиент, в котором требуется авторизация:
class HttpClient:
def __init__(self): ...
def send_request(self): ...
Нам необходимо сделать так, чтобы при отправке запроса send_request всегда использовался актуальный токен.
Решение:
Создадим клиент, который отвечает за получение актуального токена.
Он запускает фоновый поток для обновления токена и имеет публичный метод для получения актуального значения:
class AuthClient:
def __init__(self):
self._thread = None
self._future = Future()
self._token = None
threading.Thread(target=self._run, daemon=True).start()
def _run(self):
while True:
# Имитируем получение актуального токена,
# который меняется каждую секунду
self._token = uuid.uuid4().hex
print(f"Updating token, {self._token}")
if not self._future.done():
self._future.set_result(self._token)
time.sleep(1)
def get_token(self, timeout: int = 5):
if not self._future.done():
self._future.result(timeout=timeout)
return self._token
Теперь доработаем наш HTTP-клиент:
class HttpClient:
def __init__(self, auth: AuthClient):
self._auth = auth
def send_request(self):
headers = {"Authorization": f"Bearer {self._auth.get_token()}"}
print(f"Sending request with headers: {headers}")
Чтобы проверить работу, подготовим простой тест:
@pytest.fixture(scope="session")
def auth_client():
return AuthClient()
@pytest.fixture(scope="session")
def client(auth_client):
return HttpClient(auth_client)
def test_update_token(client: HttpClient):
for _ in range(5):
# Каждую секунду обновляется токен
# Каждые две секунды отправляем запрос
client.send_request()
time.sleep(2)
Результат:
test_update_token
Updating token, bab545305cd2489bac157a4e902f70ad
Sending request with headers: {'Authorization': 'Bearer bab545305cd2489bac157a4e902f70ad'}
Updating token, a2e00fa7a37c4717b585e448fc74c336
Sending request with headers: {'Authorization': 'Bearer a2e00fa7a37c4717b585e448fc74c336'}
...
Итого:
Мы создали клиент, который на протяжении всей тестовой сессии актуализирует токен в отдельном потоке, не блокируя выполнение тестов. Доработали HTTP-клиент так, чтобы перед запросом он получал актуальный токен. В итоге наши тесты не развалятся, если токен протухнет в процессе их выполнения.
Ставь реакцию если понравился пост)
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
- 🔥 23
- 👍 2






