TGViewer
Валерий | AQA Engineer | Автотестирование на Python | REST, gRPC, GraphQL Валерий | AQA Engineer | Автотестирование на Python | REST, gRPC, GraphQL @aqa_engineer · 1.52K subscribers
Post #448 1.22K
Что делать, если авторизационный токен в тестах протухает очень быстро?

На одном из вебинаров мне задали такой вопрос. Наверняка есть множество вариантов решения этой проблемы, я поделюсь одним из них — не самым технически сложным и вполне понятным для поста в 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
More from @aqa_engineer
  1. Sep 2, 2026💙💙💙💙💙 Маленькое напоминание о большой дате: где стоит провести День программиста⬆️ Ар…
  2. Sep 2, 2026Привет, давно меня не было пригар по работе, что совсем не успеваю ничего. За что прошу пр…
  3. Jul 16, 2026👩‍💻 В мае-июне я проходила курс «Автоматизация тестирования Rest API Advanced (Python)»…
  4. Jun 10, 2026Привет! Уже на следующей неделе у меня стартуют. Автоматизация тестирования брокеров сообщ…
  5. Jun 8, 2026Несколько месяцев назад я спросил, какой технический тренинг вам был бы действительно инте…
  6. Jun 6, 2026Материалы для тех, кто в теме. Одна из самых больших проблем при развитии в IT - это возмо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →