Русский
Открыть в Telegram

Пост Представьте, что ваш код – это оркестр в Мариинском театре. Каждый инструмент (поток или корутина) играет свою партию. А…

20 ноября 2024
P
Pythoner
Фотография
Представьте, что ваш код – это оркестр в Мариинском театре. Каждый инструмент (поток или корутина) играет свою партию. А вы – дирижёр, который должен убедиться, что все звучит гармонично. Вот только как это сделать, когда все играют одновременно? ➡️1. Изоляция – ключ к успеху Первое правило тестирования параллельного кода: изолируйте тесты! Каждый тест должен быть как отдельная комната в звукоизолированной студии. Используйте моки и стабы, чтобы симулировать внешние зависимости. Вот пример с использованием unittest.mock: from unittest.mock import patch import asyncio async def fetch_data(url): # Реальный запрос к API ... @patch('your_module.fetch_data') async def test_process_data(mock_fetch): mock_fetch.return_value = {'key': 'value'} result = await process_data('http://api.example.com') assert result == 'processed value' ⬆️Мы изолировали тест от реального API. Теперь он быстрый, как Усэйн Болт, и предсказуемый, как восход солнца! ➡️2. Детерминизм – ваш лучший друг Асинхронный код может быть непредсказуемым, как погода в Питере. Но ваши тесты должны быть стабильными, как гранитная набережная. Используйте семафоры, события и другие примитивы синхронизации, чтобы контролировать порядок выполнения. Вот пример с использованием asyncio.Event: import asyncio async def test_order_of_execution(): event = asyncio.Event() results = [] async def task1(): await event.wait() results.append(1) async def task2(): results.append(2) event.set() await asyncio.gather(task1(), task2()) assert results == [2, 1] ⬆️Этот тест всегда будет проходить, даже если вы запустите его на компьютере, работающем на картофельной батарейке! ➡️3. Таймауты – не просто для пиццы Установка таймаутов в тестах – это как страховка. Вы надеетесь, что она не понадобится, но лучше иметь ее под рукой. Вот как можно использовать таймауты в pytest: import pytest import asyncio @pytest.mark.asyncio async def test_long_running_task(): with pytest.raises(asyncio.TimeoutError): await asyncio.wait_for(never_ending_task(), timeout=1.0) ⬆️Этот тест убедится, что ваша функция не зависнет, как старый Windows при запуске Crysis! ➡️4. Асинхронные фикстуры – ваш секретный козырь В мире async/await фикстуры тоже должны быть асинхронными. Используйте async fixtures в pytest для подготовки и очистки тестового окружения. Вот пример: import pytest import asyncio @pytest.fixture async def database(): db = await create_database_connection() yield db await db.close() @pytest.mark.asyncio async def test_database_query(database): result = await database.fetch('SELECT * FROM users') assert len(result) > 0 ⬆️Эта фикстура – как заботливая мама, которая готовит завтрак перед школой и убирает посуду после. Только вместо завтрака у нас база данных! ➡️5. Параллельное выполнение тестов – двойная выгода Запуск тестов параллельно не только ускоряет процесс, но и помогает выявить проблемы с состоянием гонки. Используйте pytest-xdist, но будьте осторожны: убедитесь, что ваши тесты действительно независимы друг от друга. Вот команда для запуска: pytest -n auto your_test_file.py ⬆️Это как устроить гонки Формулы-1 для ваших тестов. Победит самый быстрый и надежный код! 🐍Pythoner
29 · 2K ·

Рядом в ленте

PPythoner🐍Разбор Оператор continue используется в циклах для пропуска итерации в цикле. Таким образом, пока а<4, у нас просто происходит увеличение этой переменной, а изPPythoner✈️Asyncio: ваш секретный ингредиент для высоких нагрузок Представьте, что ваше приложение – это кухня в популярном ресторане. В синхронном мире у вас один шеф-п
это сообщение

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Границы индекса · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем