Тестовые задания по Python
Здесь собраны реальные тестовые задания, которые дают соискателям на стажировках и junior-позициях. Эти задания помогут лучше подготовиться к отбору, потренироваться и пополнить портфолио
AppBooster • Высокая сложность
Тестовое задание по Python от компании AppBooster
Тестовое задание: backend Мы создаём мобильные приложения и иногда для тестирования гипотез приходится запускать AB-тесты. Для этого нам нужна система, представляющая собой простейшее REST API, состоящее из одного эндпойнта. API и распределение Мобильное приложение при запуске генерирует некоторый уникальный ID клиента (который сохраняется между сессиями) и запрашивает список экспериментов, добавляя HTTP-заголовок `Device-Token`. В ответ сервер отдаёт список экспериментов. Для каждого эксперимента клиент получает: * Ключ: имя эксперимента. В клиенте есть код, который будет изменять какое-то поведение в зависимости от значения этого ключа * Значение: строка, одна из возможных опций (см. ниже) Важно, чтобы девайс попадал в одну группу и всегда оставался в ней. Эксперименты 1. Цвет кнопки У нас есть гипотеза, что цвет кнопки «купить» влияет на конверсию в покупку * Ключ: `button_color` * Опции: * `#FF0000` → 33.3% * `#00FF00` → 33.3% * `#0000FF` → 33.3% Так после 600 запросов к API с различными `DeviceToken` каждый цвет должны получить по 200 девайсов 2. Стоимость покупки У нас есть гипотеза, что изменение стоимости покупки в приложении может повлять на нашу маржинальную прибыль. Но чтобы не терять деньги в случае неудачного эксперимента, 75% юзеров будут получать старую цену и только на малой части аудитории мы протестируем изменение: * Ключ `price` * Опции: * `10` → 75% * `20` → 10% * `50` → 5% * `5` → 10% Требования и ограничения 1. Если девайс однажды получил значение, то он всегда будет получать только его 1. Эксперимент проводится только для новых девайсов: если эксперимент создан после первого запроса от девайса, то девайс не должен ничего знать об этом эксперименте Задание 1. Спроектируйте, опишите и реализуйте API 2. Добавьте эксперименты (1) и (2) в приложение 3. Создайте страницу для статистики: простая таблица со списком экспериментов, общее количество девайсов, участвующих в эксперименте и их распределение между опциями Можно использовать любые тенхологии и библиотеки Плюсом будет: * Наличие тестов * Задеплоенная версия приложения * Скорость ответа от сервера <100ms
AvitoTech • Лёгкая сложность
Тестовое задание по Python от компании AvitoTech
Тестовое задание по python Условие Необходимо реализовать Python-библиотеку, которая осуществляет получение квадратной матрицы (NxN) с удалённого сервера и возвращает её пользователю в виде `List[int]`. Этот список должен содержать результат обхода полученной матрицы по спирали: против часовой стрелки, начиная с левого верхнего угла (см. test case ниже). Пример исходной матрицы: ``` +-----+-----+-----+-----+ | 10 | 20 | 30 | 40 | +-----+-----+-----+-----+ | 50 | 60 | 70 | 80 | +-----+-----+-----+-----+ | 90 | 100 | 110 | 120 | +-----+-----+-----+-----+ | 130 | 140 | 150 | 160 | +-----+-----+-----+-----+ ``` Матрица гарантированно содержит целые неотрицательные числа. Форматирование границ иными символами не предполагается. Требования к выполнению и оформлению - Библиотека содержит функцию со следующим интерфейсом: ```python async def get_matrix(url: str) -> List[int]: ... ``` - Функция единственным аргументом получает URL для загрузки матрицы с сервера по протоколу HTTP(S). - Функция возвращает список, содержащий результат обхода полученной матрицы по спирали: против часовой стрелки, начиная с левого верхнего угла. - Взаимодействие с сервером должно быть реализовано асинхронно - посредством aiohttp, httpx или другого компонента на asyncio. - Библиотека должна корректно обрабатывать ошибки сервера и сетевые ошибки (5xx, Connection Timeout, Connection Refused, ...). - В дальнейшем размерность матрицы может быть изменена с сохранением форматирования. Библиотека должна сохранить свою работоспособность на квадратных матрицах другой размерности. - Решение задачи необходимо разместить на одном из публичных git-хостингов (GitHub, GitLab, Bitbucket). Можно также выслать решение в виде архива (zip, tar). Загружать библиотеку в PyPi или другие репозитории не требуется. Проверка решения - Для самостоятельной проверки можно использовать следующий test case: ```python SOURCE_URL = './backend/Python/AvitoTech/matrix.txt' TRAVERSAL = [ 10, 50, 90, 130, 140, 150, 160, 120, 80, 40, 30, 20, 60, 100, 110, 70, ] def test_get_matrix(): assert asyncio.run(get_matrix(SOURCE_URL)) == TRAVERSAL ``` При проверке мы также будем обращать внимание на тесты, type hints, структуру решения и общее качество кода. Удачи в выполнении задачи и не забывайте о [The Zen of Python](https://www.python.org/dev/peps/pep-0020/#the-zen-of-python)! :)
AvitoTech • Средняя сложность
Тестовое задание по Python от компании AvitoTech
Тестовое задание на позицию стажера/junior бекенд разработчика в юнит Авто Задача: Нужно сделать HTTP сервис для сокращения URL наподобие [Bitly](https://bitly.com/) и других сервисов. UI не нужен, достаточно сделать JSON API сервис. Должна быть возможность: - сохранить короткое представление заданного URL - перейти по сохраненному ранее короткому представлению и получить redirect на соответствующий исходный URL Требования: - Язык программирования: Go/Python/PHP/Java/JavaScript - Предоставить инструкцию по запуску приложения. В идеале (но не обязательно) – использовать контейнеризацию с возможностью запустить проект командой [`docker-compose up`](https://docs.docker.com/compose/) - Требований к используемым технологиям нет - можно использовать любую БД для персистентности - Код нужно выложить на github (просьба не делать форк этого репозитория, чтобы не плодить плагиат) Усложнения: - Написаны тесты (постарайтесь достичь покрытия в 70% и больше) - Добавлена валидация URL с проверкой корректности ссылки - Добавлена возможность задавать кастомные ссылки, чтобы пользователь мог сделать их человекочитаемыми - [http://bit.ly/avito-auto-be](http://bit.ly/avito-auto-be) - Проведено нагрузочное тестирование с целью понять, какую нагрузку на чтение может выдержать наш сервис - Если вдруг будет желание, можно слепить простой UI и выложить сервис на бесплатный хостинг - Google Cloud, AWS и подобные.
Ivelum • Средняя сложность
Тестовое задание по Python от компании Ivelum
Обратите внимание Перед решением тестового задания заполните, пожалуйста, небольшую форму отклика для интересующей вас вакансии по адресу: https://job.ivelum.com После заполнения анкеты мы свяжемся с вами, ответим на ваши вопросы по вакансии и расскажем подробнее о наших проектах. По результатам этого общения мы можем предложить вам попробовать сделать тестовое задание, которое описано ниже. Присылайте ваше решение на адрес [job@ivelum.com](mailto:job@ivelum.com). Hacker™ News proxy Реализовать простой http-прокси-сервер, запускаемый локально, который показывает содержимое страниц [Hacker News](https://news.ycombinator.com). Прокси должен модицифировать текст на страницах следующим образом: после каждого слова из шести букв должен стоять значок «™». Пример™: Исходный текст: https://news.ycombinator.com/item?id=13713480 ``` The visual description of the colliding files, at http://shattered.io/static/pdf_format.png, is not very helpful in understanding how they produced the PDFs, so I took apart the PDFs and worked it out. Basically, each PDF contains a single large (421,385-byte) JPG image, followed by a few PDF commands to display the JPG. The collision lives entirely in the JPG data - the PDF format is merely incidental here. Extracting out the two images shows two JPG files with different contents (but different SHA-1 hashes since the necessary prefix is missing). Each PDF consists of a common prefix (which contains the PDF header, JPG stream descriptor and some JPG headers), and a common suffix (containing image data and PDF display commands). ``` Через ваш прокси™: http://127.0.0.1:8232/item?id=13713480 ``` The visual™ description of the colliding files, at http://shattered.io/static/pdf_format.png, is not very helpful in understanding how they produced the PDFs, so I took apart the PDFs and worked™ it out. Basically, each PDF contains a single™ large (421,385-byte) JPG image, followed by a few PDF commands to display the JPG. The collision lives entirely in the JPG data - the PDF format™ is merely™ incidental here. Extracting out the two images™ shows two JPG files with different contents (but different SHA-1 hashes™ since the necessary prefix™ is missing). Each PDF consists of a common™ prefix™ (which contains the PDF header™, JPG stream™ descriptor and some JPG headers), and a common™ suffix™ (containing image data and PDF display commands). ``` Условия: * последняя версия™ Python™ * страницы должны™ отображаться и работать полностью корректно, в точности так, как и оригинальные (за исключением модифицированного текста™); * при навигации по ссылкам, которые ведут на другие™ страницы HN, браузер должен™ оставаться на адресе™ вашего™ прокси™; * можно использовать любые общедоступные библиотеки, которые сочтёте нужным™; * чем меньше™ кода, тем лучше. PEP8 — обязательно; * если в условиях вам не хватает каких-то данных™, опирайтесь на здравый смысл. Если задачу™ удалось сделать быстро™, и у вас еще остался энтузиазм - как насчет™ написания тестов™? Присылайте ваше решение в виде ссылки™ на gist или на публичный репозиторий на GitHub™. Обратите внимание Напомним порядок действий: 1. Пожалуйста, заполните форму отклика на сайте https://job.ivelum.com; 2. Мы свяжемся с вами, ответим на ваши вопросы по вакансии и расскажем про наши проекты. По результатам этого общения мы можем предложить вам попробовать сделать тестовое задание, которое описано выше; 3. Присылайте ваше решение на [job@ivelum.com](mailto:job@ivelum.com).
без ограничений.
Чтобы получить полный доступ,
вам необходимо зарегистрироваться.