Тестовые задания по Python
Здесь собраны реальные тестовые задания, которые дают соискателям на стажировках и junior-позициях. Эти задания помогут лучше подготовиться к отбору, потренироваться и пополнить портфолио
MarketIntelligence • Средняя сложность
Тестовое задание по Python от компании MarketIntelligence
Тестовое задание для стажера в Market Intelligence. Задача: Нужно сделать HTTP сервис для одноразовых секретов наподобие [https://onetimesecret.com/](https://onetimesecret.com/?locale=ru). Он должен позволить создать секрет, задать кодовую фразу для его открытия и cгенерировать код, по которому можно прочитать секрет только один раз. UI не нужен, это должен быть JSON Api сервис. Для написание сервиса можно использовать [FastAPI](https://github.com/tiangolo/fastapi) или любой другой фреймворк. - Метод `/generate` должен принимать секрет и кодовую фразу и отдавать `secret_key` по которому этот секрет можно получить. - Метод `/secrets/{secret_key}` принимает на вход кодовую фразу и отдает секрет. Требования: - Язык программирования: Python 3.7. - Использование [Docker](https://www.docker.com), сервис должен запускаться с помощью [`docker-compose up`](https://docs.docker.com/compose/reference/up/). - Требований к используемым технологиям нет. - Код должен соответствовать PEP, необходимо использование type hints, к публичным методам должна быть написана документация на английском языке. Усложнения: - Написаны тесты (постарайтесь достичь покрытия в 70% и больше). Вы можете использовать [pytest](https://docs.pytest.org/en/latest/) или любую другую библиотеку для тестирования. - Сервис асинхронно обрабатывает запросы. - Данные сервиса хранятся во внешнем хранилище, запуск которого также описан в `docker-compose`. Мы рекомендуем использовать [MongoDB](https://www.mongodb.com), но Вы можете использовать любую подходящую базу. - Секреты и кодовые фразы не хранятся в базе в открытом виде. - Добавлена возможность задавать время жизни для секретов. Можно попробовать реализовать это с помощью [TTL индексов](https://docs.mongodb.com/manual/core/index-ttl/).
PyShop • Высокая сложность
Тестовое задание по Python от компании PyShop
Тестовое задание для разработчика на python У сети ресторанов доставки "ФорФар" есть множество точек, на которых готовятся заказы для клиентов. Каждый клиент хочет вместе с заказом получить чек, содержащий детальную информацию о заказе. Сотрудники кухни также хотят чек, чтобы в процессе готовки и упаковки заказа не забыть положить всё что нужно. Наша задача помочь и тем и другим, написав сервис для генерации чеков. Схема работы сервиса ![][arch] 1. Сервис получает информацию о новом заказа, создаёт в БД чеки для всех принтеров точки указанной в заказе и ставит асинхронные задачи на генерацию PDF-файлов для этих чеков. Если у точки нет ни одного принтера - возвращает ошибку. Если чеки для данного заказа уже были созданы - возвращает ошибку. 2. Асинхронный воркер с помощью wkhtmltopdf генерируют PDF-файл из HTML-шаблон. Имя файла должно иметь следущий вид <ID заказа>\_<тип чека>.pdf (123456_client.pdf). Файлы должны хранится в папке media/pdf в корне проекта. 3. Приложение опрашивает сервис на наличие новых чеков. Опрос происходит по следующему пути: сначала запрашивается список чеков которые уже сгенерированы для конкретного принтера, после скачивается PDF-файл для каждого чека и отправляется на печать. Технические требования 1. Сервис должен быть написан на python и Django 2. База данных - PostgreSQL v9.6 3. Для асинхронных задач использовать django_rq 4. Все инфраструктурные вещи необходимые для сервиса ([PostgreSQL], [Redis], [wkhtmltopdf]) запускать в docker с помощью docker-compose, **_сам проект не нужно оборачивать в docker_** 5. Помимо API, должна быть админка для обеих моделей, с возможностью фильтровать чеки по принтеру, типу и статусу Примечания 1. Вёрстка HTML-шаблонов для чеков лежит в репозитории в папке templates 2. Для простоты работы с wkhtmltopdf стоит использовать docker-контейнер [wkhtmltopdf] 3. Во время написания сервиса не стоит изобретать велосипеды, лучше взять что-то существующие Модели 1. Принтер (Printer). Каждый принтер печатает только свой тип чеков. Поле api_key принимает уникальные значения, по нему однозначно определяется принтер. Для этой модели должны быть fixtures (принтеры для обоих типов чеков для нескольких точек). | Поле | Тип | Значение | Описание | | ---------- | ------------ | --------------- | --------------------------------- | | name | CharField | | название принтера | | api_key | CharField | | ключ доступа к API | | check_type | CharField | kitchen\|client | тип чека которые печатает принтер | | point_id | IntegerField | | точка к которой привязан принтер | 2. Чек (Check). Информация о заказе для каждого чека хранится в JSON, нет необходимости делать отдельные модели. | Поле | Тип | Значение | Описание | | ---------- | ---------- | ---------------------- | ---------------------------- | | printer_id | ForeignKey | | принтер | | type | CharField | kitchen\|client | тип чека | | order | JSONField | | информация о заказе | | status | CharField | new\|rendered\|printed | статус чека | | pdf_file | FileField | | ссылка на созданный PDF-файл | API Описание доступных методов находится в файле [api.yml](api.yml) (swagger-спецификация). Можно отрендерить через [онлайн редактор][swagger] или через соответствующий плагин для PyCharm или VSCode [wkhtmltopdf]: https://hub.docker.com/r/openlabs/docker-wkhtmltopdf-aas/ [postgresql]: https://hub.docker.com/_/postgres/ [redis]: https://hub.docker.com/_/redis/ [swagger]: https://editor.swagger.io/ [arch]: images/arch.png
Python • Средняя сложность
Тестовое задание по Python от компании Python
Задание 1. Разработать функцию определения счета в игре Задача В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча. Разработайте функцию get_score(game_stamps, offset), которая вернет счет на момент offset в списке game_stamps. Нужно суметь понять суть написанного кода, заметить нюансы, разработать функцию вписывающуюся стилем в существующий код, желательно адекватной алгоритмической сложности. ```Python from pprint import pprint import random import math TIMESTAMPS_COUNT = 50000 PROBABILITY_SCORE_CHANGED = 0.0001 PROBABILITY_HOME_SCORE = 0.45 OFFSET_MAX_STEP = 3 INITIAL_STAMP = { "offset": 0, "score": { "home": 0, "away": 0 } } def generate_stamp(previous_value): score_changed = random.random() > 1 - PROBABILITY_SCORE_CHANGED home_score_change = 1 if score_changed and random.random() > 1 - \ PROBABILITY_HOME_SCORE else 0 away_score_change = 1 if score_changed and not home_score_change else 0 offset_change = math.floor(random.random() * OFFSET_MAX_STEP) + 1 return { "offset": previous_value["offset"] + offset_change, "score": { "home": previous_value["score"]["home"] + home_score_change, "away": previous_value["score"]["away"] + away_score_change } } def generate_game(): stamps = [INITIAL_STAMP, ] current_stamp = INITIAL_STAMP for _ in range(TIMESTAMPS_COUNT): current_stamp = generate_stamp(current_stamp) stamps.append(current_stamp) return stamps game_stamps = generate_game() pprint(game_stamps) def get_score(game_stamps, offset): ''' Takes list of game's stamps and time offset for which returns the scores for the home and away teams. Please pay attention to that for some offsets the game_stamps list may not contain scores. ''' # return home, away ``` Результат 1. Ссылка на [gist](https://gist.github.com/) с исходным кодом функции. Задание 2. Разработать тесты для функции определения счета в игре Задача Для разработанной в предыдущем задании функции get_score(game_stamps, offset) разработайте unit-тесты на фреймворке [unittest](https://docs.python.org/3/library/unittest.html). Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки. Результат 1. Ссылка на [gist](https://gist.github.com/) с исходным кодом тестов. Задание 3. Разработать парсер смартфонов Задача Разработать парсер, который будет собирать информацию о версиях операционных систем в топ-100 смартфонах с самым высоким рейтингом пользователей в каталоге [ozon.ru](http://ozon.ru/). На сайте [ozon.ru](http://ozon.ru/) в категории “Электроника -> Телефоны и смарт-часы” с сортировкой “Высокий рейтинг” нужно собрать информацию о первых 100 смартфонах попавших в выборку. Перейти на страницу с каждым из них и забрать информацию о версии операционной системы из характеристик. По собранным данным построить распределение моделей по версиям операционных систем в порядке убывания, например: ```txt Android 8 — 12 Android 10 — 9 iOS 14 — 8 … ``` Для парсинга следует использовать язык программирования Python, фреймворк Scrapy, для скачивания динамических частей сайта следует использовать Scrapy+Selenium. В выполнении задания может помочь scrapy proxy rotation middleware. Для расчета распределения следует использовать фреймворк Pandas. Результат 1. Ссылка на [gist](https://gist.github.com/) с распределение моделей устройств по версиям операционных систем в plain-text формате. 2. Ссылка на [github-репозиторий](https://github.com/) с публичным доступом с исходными кодами решения.
Python • Высокая сложность
Тестовое задание по Python от компании Python
Тестовое задание в Контент В Контенте мы занимаемся агрегацией отелей поставщиков (supplier), объединяя одинаковые отели от разных поставщиков в единую сущность (мета-отель). В этом задании мы предлагаем реализовать базовый сервис (API) для работы с отелями. Для дополнительного контекста и перспективы, представьте что это ключевой сервис в вашем тревел стартапе. Функциональность Список API, которые должны быть покрыты в этом задании: - Создать отель поставщика - Объединить 1 и более отелей поставщиков в один мета-отель - Получить список мета-отелей и входящих в них отелей - Перепривязать отель к другому мета-отелю - Получить историю привязки отеля (к каким мета-отелям в какой момент времени он был привязан) Требования и ограничения - Авторизация/аутентификация не нужна - Отель может быть привязан только к одному мета-отелю в один момент времени - В мета-отеле должен быть минимум один отель - Отель можно отвязать от мета-отеля и привязать к другому Пример данных Мета-отель: ``` id: mercure_pattaya id: windways ``` Отель: ``` id: 1 name: Mercure Pattaya supplier_id: AAA id: 2 name: Mercure Pattaya supplier_id: BBB id: 3 name: Windways Hotel supplier_id: AAA ``` Оценка Цель этого тестового задания - увидеть ваш лучший/самый идиоматичный код на Python/Django. Мы ожидаем увидеть: - Документацию API - README с описанием как запустить проект, запустить тесты и т.д - Чистую архитектуру, с корректной связанностью кода (decoupling), complexity isolation - Аккуратный, понятный, поддерживаемый код, с наличием комментариев к коду (если нужны) - Код на публичной платформе (github/gitlab/bitbucket) - Отсутствие "мертвого" кода (т.е пустые модули, неиспользуемые функции и параметры и т.д) - Тесты (доказательство работоспособности кода) - Реализация на Django + любой REST или RPC фреймворк, с которым вам комфортно - PostgreSQL в качестве БД (помните про блокировки, транзакции, race conditions) - Сервис корректно работает, если запущен в нескольких экземплярах (инстансах) - Проект должен запускаться через docker-compose Вопросы и сроки Cтрогих сроков нет, но мы хотели бы получить от вас примерную оценку времени. Не стесняйтесь задавать вопросы по заданию, если таковые возникнут.
без ограничений.
Чтобы получить полный доступ,
вам необходимо зарегистрироваться.