Ваша задача — протестировать сервис, который управляет пользователями и их сессиями в системе. Сервис предоставляет методы для регистрации пользователей, записи сессий, вычисления времени активности, поиска неактивных пользователей и получения метрик активности по месяцам. Вы должны проверить его работоспособность, используя различные виды тестов, а также анализировать покрытие кода.
Важно: код сервиса может содержать ошибки. Спецификацией считаются JavaDoc-комментарии к методам. Если поведение метода не соответствует его спецификации — это баг. Ваша задача — обнаружить такие расхождения с помощью тестов.
-
Изучите спецификацию методов сервиса:
- Ознакомьтесь с кодом класса
UserAnalyticsServiceи спецификацией методов, представленных в комментариях к коду.
- Ознакомьтесь с кодом класса
-
Создайте план тестирования:
- Определите, какие тесты нужно написать для проверки функциональности каждого метода, чтобы удостовериться в правильности работы сервиса.
- Особое внимание уделите:
- Граничным случаям:
- Например, проверьте регистрацию пользователя с уже существующим ID, вычисление времени активности для пустой сессии, поиск неактивных пользователей, если все пользователи активны и т.д.
- Например, что происходит, если сессия начинается в одном месяце, а заканчивается в другом.
- Тестам на корректность:
- Например, правильность вычисления общего времени активности, корректность фильтрации сессий по месяцам.
- Граничным случаям:
-
Реализуйте тесты:
- Напишите юнит-тесты для каждого из методов сервиса. Каждый тест должен:
- Проверять нормальную работу метода.
- Проверять поведение метода в граничных случаях.
- Проверять корректность выбрасывания исключений, если это предусмотрено спецификацией.
- Используйте библиотеку для тестирования, например, JUnit.
- Напишите юнит-тесты для каждого из методов сервиса. Каждый тест должен:
-
Проверьте покрытие кода:
- Используйте инструмент для анализа покрытия кода, например, JaCoCo или встроенный в IDE, чтобы определить, какие части кода были протестированы. Покрытие измеряется для текущего кода как есть — исправлять код сервиса не нужно.
- Проверьте два вида покрытия:
- Покрытие строк (line coverage):
- Убедитесь, что каждая строка в коде метода была протестирована хотя бы один раз.
- Покрытие ветвей (branch coverage):
- Убедитесь, что все возможные пути выполнения (ветви) были проверены. Это особенно важно для методов с условными операторами, например,
if,else, и исключениями.
- Убедитесь, что все возможные пути выполнения (ветви) были проверены. Это особенно важно для методов с условными операторами, например,
- Покрытие строк (line coverage):
-
Добейтесь достойного покрытия:
- Попробуйте достичь как минимум 90% покрытия строк и 80% покрытия ветвей. Если в процессе тестирования не удаётся достичь этих показателей, объясните, почему не удалось покрыть определённые участки кода (например, из-за сложности условий или невозможности воспроизвести определённые сценарии).
-
Обоснование покрытия:
- После того как вы добьётесь необходимого покрытия, предоставьте обоснование того, почему этого покрытия достаточно. Подумайте, какие участки кода критичны для корректной работы системы и почему тестирование всех ветвей в некоторых случаях может быть избыточным.
-
План тестирования:
- Тесты должны покрывать основные сценарии работы сервиса, включая граничные случаи.
-
Реализованные тесты:
- Для каждого метода должны быть написаны тесты, которые проверяют корректность работы, а также выбрасывание исключений в случае ошибок.
- Если тест обнаруживает баг (поведение не соответствует спецификации), не исправляйте код сервиса — оставьте тест падающим. Это доказательство найденного бага.
-
Описание найденных багов:
- Для каждого обнаруженного бага расскажите: какой метод затронут, в чём расхождение со спецификацией, и какой тест это демонстрирует.
-
Обоснование покрытия:
- Должно быть предоставлено обоснование, что выбранное покрытие тестов достаточно для проверки корректности сервиса.
- Код сервиса изменять запрещено. Тесты пишутся для кода «как есть».
- Если во время написания тестов возникает какая-то неоднозначная ситуация, то решить её можно самостоятельно, не надо спрашивать преподавателя.