Тестовые задания по Java
Здесь собраны реальные тестовые задания, которые дают соискателям на стажировках и junior-позициях. Эти задания помогут лучше подготовиться к отбору, потренироваться и пополнить портфолио
СКБ Контур • Высокая сложность
Тестовое задание по Java от компании СКБ Контур
Задача: Реализовать функцию автодополнения следующим образом: по началу слова необходимо выдавать список из 10 наиболее часто встречающихся слов, начинающихся с указанного префикса. Сортировать варианты автодополнения в порядке убывания частоты использования. В случае равенства частот - варианты сортируются естественным образом (по алфавиту). Если вариантов меньше 10, то выдавать столько, сколько нашли. I часть Решение должно быть в виде консольного java-приложения. Исходные данные подаются через стандартный поток ввода, а все результаты выводятся в стандартный поток вывода. Исходные данные: В первой строке находится единственное число N (1 ≤ N ≤ 10^5) - количество слов в словаре. Каждая из следующих N строк содержит слово wi (непустая последовательность строчных латинских букв длиной не более 15) и целое число ni (1 ≤ ni ≤ 10^6) - частота употребления слова wi. Слово и число разделены единственным пробелом. Ни одно слово не повторяется более одного раза. В (N+2)-й строке находится число M (1 ≤ M ≤ 15000). В следующих M строках содержатся слова uj (непустая последовательность строчных латинских букв длиной не более 15) - начала слов, введённых пользователем. Результат: Для каждой из M строк необходимо вывести наиболее употребляемые слова, начинающиеся с uj. Варианты дополнения для каждого слова необходимо разделять переводами строк. Пример: stdin 5 kare 10 kanojo 20 karetachi 10 korosu 7 sakura 3 3 k ka kar stdout kanojo kare korosu karetachi kanojo kare karetachi kare karetachi II часть Решение должно быть в виде web-приложения с использованием [Spring MVC] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html) и [AngularJS] (https://angularjs.org/). Запускать приложение на [Apache Tomcat] (http://tomcat.apache.org/). Исходные данные подаются через файл. Исходные данные: В первой строке находится единственное число N (1 ≤ N ≤ 10^5) - количество слов в словаре. Каждая из следующих N строк содержит слово wi (непустая последовательность строчных латинских букв длиной не более 15) и целое число ni (1 ≤ ni ≤ 10^6) - частота употребления слова wi. Слово и число разделены единственным пробелом. Ни одно слово не повторяется более одного раза. Результат: На главной странице web-приложения должна быть единственная строка с вводом. Ввод символов в строку должен сопровождаться выдачей вариантов автодополнения. Дополнительные требования: Использование [maven] (https://maven.apache.org/) приветствуется (либо требуется иной скрипт для сборки) Код на Java в стиле, соответствующем рекомендациям http://google.github.io/styleguide/javaguide.html Приоритет на скорость работы (решение должно отрабатывать не дольше 1-10 секунд на тестовом файле [test.in] (https://github.com/dmitryanufriev/kontest/blob/master/test.in))
СКБ Контур • Лёгкая сложность
Тестовое задание по Java от компании СКБ Контур
Тестовое задание на позицию стажер-java в СКБ Контур Сокращатель ссылок Необходимо разработать HTTP-сервис, который генерирует короткие ссылки. Описание В сервисе должна быть реализована следующая функциональность: 1. Генератор ссылок Ресурс /generate должен обрабатывать POST-запрос, содержащий оригинальную ссылку, и генерировать короткую ссылку. Оригинальная ссылка передается в теле POST-запроса в поле “original” JSON-объекта. Сгенерированная короткая ссылка передается в теле ответа в поле “link” JSON-объекта. Сгенерированная короткая ссылка должна иметь формат /l/{some-short-name}, то есть не должна содержать адрес сервера, где some-short-name - идентификатор ссылки. Алгоритм генерации этого идентификатора и его формат остается на усмотрение автора. Пример запроса: POST /generate Пример тела запроса: { “original”: “https://some-server.com/some/url?some_param=1” } Пример ответа: { “link”: “/l/some-short-name” } 2. Редирект Ресурс /l/{some-short-name} должен осуществлять редирект на оригинальный url. Параметры пути запроса: - some-short-name - идентификатор ссылки Пример запроса: GET /l/some-short-name Предлагаем подумать, каким образом можно оптимизировать работу с ссылками, по которым происходит много переходов. 3. Статистика 3.1 Статистика по конкретным ссылкам Ресурс /stats/{some-short-name} должен обрабатывать GET-запрос и возвращать статистику переходов по конкретной ссылке. Параметры пути запроса: - some-short-name - идентификатор ссылки В ответе сервиса должен содержаться JSON-объект со следующими полями: - link - сгенерированная короткая ссылка - original - оригинальная ссылка - rank - место ссылки в топе запросов - count - число запросов по короткой ссылке Пример запроса: GET /stats/some-short-name Пример ответа: { “link”: “/l/some-short-name”, “original”: “http://some-server.com/some/url” “rank”: 1, “count”: 100500 } 3.2 Рейтинг ссылок Ресурс /stats должен обрабатывать GET-запрос и возвращать статистику запросов с сортировкой по частоте запросов по убыванию и возможностью постраничного отображения. Параметры строки запроса: - page - номер страницы - count - число записей, отображаемых на странице, максимальное возможное значение 100 (включительно) В ответе сервиса должен содержаться массив из JSON-объектов, описанных в разделе 3.1 Статистика по конкретным ссылкам. Пример запроса: GET /stats?page=1&count=2 Пример ответа: [ { “link”: “/l/some-short-name”, “original”: “http://some-server.com/some/url” “rank”: 1, “count”: 100500 }, { “link”: “/l/some-another-short-name”, “original”: “http://another-server.com/some/url” “rank”: 2, “count”: 40000 } ] Требования к сервису 1. При создании сервиса можно воспользоваться любым из указанных фреймворков: Spring Framework, Spring Boot, Undertow, или написать приложение на чистой Java. 2. Сервис должен запускаться как standalone-приложение (java -jar service.jar). 3. Необходимо покрыть сервис Unit-тестами. Полнота покрытия остается на усмотрение автора решения. 4. Приложение должно собираться с использованием Apache Maven. 5. По возможности необходимо придерживаться REST-архитектуры. 6. Не использовать отдельно устанавливаемые базы данных, кэши и т.п. Можно использовать embedded базы данных (например, H2 в режиме встроенной БД). Прочие требования 1. Язык программирования: Java 8. 2. Оформление кода должно соответствовать общепринятым нормам (например, https://google.github.io/styleguide/javaguide.html) 3. Исходники необходимо упаковать в ZIP-архив вместе с кратким описанием решения и инструкцией по сборке и запуску. Архив необходимо загрузить на файлообменник, и отправить ссылку на архив в заявке на стажировку 4. Проверка решения будет осуществляться в автоматизированном режиме (функциональные и нагрузочные тесты), поэтому важно соблюдение указанных в задании требований. 5. Всё, что явно не указано в условиях, остаётся на усмотрение автора решения.
Eltex • Средняя сложность
Тестовое задание по Java от компании Eltex
Многопользовательский тайм-трекер Задача: разработать Backend сервиса Многопользовательский тайм-трекер, доступ к которому можно получить по REST. Тайм-трекер (англ. Time-tracker или Time-tracking software) - это категория компьютерного программного обеспечения, которое позволяет сотрудникам, работающим за компьютерами, записывать время, потраченное на выполнение задач или проектов, а работодателям их контролировать. Типы запросов создать пользователя трекинга; изменить данные пользователя; начать отсчет времени по задаче Х; прекратить отсчет времени по задаче Х; показать все трудозатраты пользователя Y за период N..M в виде связного списка Задача - Сумма затраченного времени в виде (чч:мм) с сортировкой от большего к меньшему (для ответа на вопрос, На какие задачи я потратил больше времени); показать все временные интервалы занятые работой за период N..M в виде связного списка Временной интервал (число чч:мм) - Задача (для ответа на вопросы, На что ушла моя неделя или Где за прошедшую неделю были ‘дыры’, когда я ничего не делал); показать сумму трудозатрат по всем задачам пользователя Y за период N..M (как будто для отображения на панели Отработано на этой неделе); очистить данные трекинга пользователя Z; удалить всю информацию о пользователе Z. Дополнительные условия Если пользователь не завершил отсчет своего времени, то он должен завершаться автоматически в 23:59 текущего дня. Данные должны храниться в системе не более периода, указанного в конфигурации сервиса. Очистка данных производится задачей по расписанию, работающей в составе java приложения. Детали реализации Только backend! RESTful, HTTP, JSON. Разбивать на микросервисы не нужно. Все SQL таблицы существуют в одной схеме данных. Запуск на Ubuntu/Debian или Docker compose. Security не требуется. Доступ к API может быть открытым без аутентификации и авторизации. В реальной системе имя пользователя, конечно, передавалось бы в заголовках, token’ах или где-то еще. В данной задаче имя пользователя передается в запросе. Данные следует хранить в базе данных MySQL или PostgreSQL. Система должна журналировать происходящие события и ошибки с помощью одного из общепринятых логгеров logback/log4j. Проект должен содержать список всех REST команд которые можно выполнить с кратким описанием входных и выходных данных. Спецификация OpenAPI приветствуется. Язык для документации русский или английский на усмотрение разработчика. Проект должен содержать README файл с описанием, из которого должно быть понятна процедура сборки, места хранения персистентных данных и журналов работы приложения. Исходный код Проект необходимо вести в публичном GitHub. По истории commit'ов должна быть видна самостоятельная разработка кандидата. Один commit с полным набором исходников не приветствуется. Язык программирования Java 8+ или Kotlin. Можно использовать Spring, другие фреймворки и библиотеки на усмотрение автора. В проекте должны быть написаны тесты, демонстрирующие все типы запросов и сценарии. Сроки Мы никуда не спешим. После ознакомления с ТЗ вы сами определяете срок, за который сможете его выполнить. Обычно это 2-4 недели. Можно быстрее, если это не навредит качеству. Можно дольше, но все равно срок надо обозначить заранее. При проверке оценивается Работоспособность решения Удобство и надежность API Полноты README и другой документации Журнал работы Код решения Обработка ошибок Javadoc, комментарии Тесты Контакты автора MikhaelGaydamaka можно задавать вопросы.
KazanExpress • Лёгкая сложность
Тестовое задание по Java от компании KazanExpress
Тестовое задание на Android разработку Тут находится описание тестового задания для кандидатов на Android-разработку в команду KazanExpress. Задача Нужно реализовать простое приложение, которое помогает пользователю найти интересующий его коктейль. Работать данное приложение должно с TheCocktailDb API. Есть три уровня сложности: [Easy] - для претендующих на позицию Junior Android Dev [Medium] - для претендующих на позицию Middle Android Dev [Hard] - для претендующих на позицию Senior Android Dev Требования к задаче Ниже будут описаны требования для выполнения задачи к каждому из уровней сложности. Уровни Medium и Hard подразумевают собой выполнение предыдущего уровня сложности. Easy На начальном уровне сложности главной задачей приложения будет отрисовка экрана с информацией о коктейле. Для получения рандомного коктейля во время загрузки приложения можно использовать данный GET запрос. Требования: У приложения должны быть онбординги, на них можно отобразить любую информацию о приложении; При запуске приложения на старте показываем индикатор прогресса на время ожидания ответа с сервера (по желанию можно добавить splash screen до экрана загрузки на свой вкус); На странице коктейля должно быть отображено: фото коктейля, название, id, категория, тип коктейля, тип стакана для сервировки; Статус бар должен быть прозрачным, а изображение коктейля "лежать" под статус баром; Картинки коктейлей нужно подгружать асинхронно (на время загрузки показываьб индикатор прогресса); Также дополнительно должен быть раздел "Ингридиенты", который появляется при скролле страницы товара; Должна быть кнопка "Добавить в избранное" в виде иконки сердечка. При клике на иконку нужно менять ее состояние (полезная работа не выполняется, просто меняем состояние иконки - например, закрашиваем); Через Pull-to-Refresh (Swipe-to-Refresh) отображать новый коктейль (повторно запросить рандомный и отрисовать); Нужно уметь обрабатывать ошибки сети. При возникновении ошибки выводить кнопку Retry, при клике на которую приложение пытается загрузить новый коктейль и отобразить его. Medium Нужно реализовать все, что было перечислено в Easy, но помимо этого: Сделать стартовый экран приложения с поисковой строкой и миниатюрными "карточками" уже посещённых коктейлей; Позволить пользователю с помощью поисковой строки находить коктейли. В случае, если запрос на поиск по названию коктейля вернул результат, переходить на страницу первого элемента из списка. Если же запрос ничего не вернул - показывать соответствующий toast с информацией; Добавить на страницу коктейля кнопку "Назад", которая возвращала бы на главный экран. Hard Нужно реализовать все, что было перечислено в Medium, но помимо этого: Сделать навигационное меню с пунктами "Главная", "Категории" и "Избранное"; Функционал главной страницы оставить по аналогии с уровнем сложности Medium; На странице "Категории" отобразить список категорий коктейлей; При клике на любой элемент из списка категорий, отображать экран с каталогом миниатюрных "карточек" коктейлей из соответствующей категории; Все картинки коктейлей на миниатюрах должны асинхронно подгружаться; Каталог "карточек" должен появиться как только все данные по карточкам подгрузятся. Во время ожидания подгрузки нужно отображать скелетоны карточек; Со страницы коктейля кнопка "Назад" должна отправлять пользователя на последний активный Activity. Правила сдачи задания Нужно будет создать Pull Request с ваши решением в данный репозиторий, а также отправить apk-файл на почту kevin@kazanexpress.ru. Сроки - Easy и Medium - 7 дней, Hard - 14 дней. P.S. Приятный визуал приветствуется. Особое внимание будет уделено чистоте кода.
без ограничений.
Чтобы получить полный доступ,
вам необходимо зарегистрироваться.