Closed urmat-mederbekov closed 4 years ago
Прошу перенести на следующий спринт, так как не все пункты выполнены. Выполнены пункты 1, 2 и 3 в Спринте 6. Фактическое время выполнения пунктов 1, 2 и 3 - 6 часов 25 мин. Создание тестов заняло большую часть времени, особенно checkUserPresence
При работе над DoctorControllerTest для Senior_Doctor возникли проблемы:
Изучал создание теста для @Controller
методов. Делал на основе:
https://www.petrikainulainen.net/programming/spring-framework/unit-testing-of-spring-mvc-controllers-normal-controllers/
сделанный вариант ожидал статус 200, а получал 302. Решил что дело в csrf token, поэтому нашел как его добавить
https://stackoverflow.com/questions/21749781/why-i-received-an-error-403-with-mockmvc-and-junit
Это не дало результата, но в случае необходимости можно добавить token в тестовый запрос:
Далее пришел к выводу что redirect 302 происходит из-за spring security http.authorizeRequests() защиты. Изучал более подробно реализацию авторизации. Для теста нашел примеры: https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/test-mockmvc.html
В Spring Security есть возможность настройки ролей и доступов. Может пригодиться: https://www.baeldung.com/role-and-privilege-for-spring-security-registration https://www.baeldung.com/spring-security-granted-authority-vs-role https://stackoverflow.com/questions/15203485/spring-test-security-how-to-mock-authentication
После обсуждения с наставником, пробовал переделать имеющийся тест через Mock, в ходе чего столкнулся с тем, что когда для тестового класса DoctorControllerTest
подключается @RunWith(MockitoJUnitRunner.class)
необходимо инициализировать MockMVC
(иначе выдает ошибку NullPointerException - так как MockMVC = null)
В ходе изучения обнаружил полезную информацию:
https://habr.com/ru/post/433958/
или
Итог:
@SpringBootTest
. Он содержит в себе JPA (@DataJpaTest
) и Web (@WebMvcTest
) компоненты. JPA содержит:
@DataJpaTest
содержит в себе:@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureCache
@AutoConfigureTestEntityManager
@Transactional
, а значит можно настроить тестовую базу.
Соответственно при использовании @SpringBootTest
и возможно создать тестовую базу внутри теста через ручную настройку ApplicationContext
. Необходимо еще изучить это:
https://reflectoring.io/spring-boot-test/ - Customizing the Application ContextДля контроллеров лучше использовать @WebMvcTest
- что и предлагают другие различные источники:
https://reflectoring.io/spring-boot-web-controller-test/
https://www.baeldung.com/spring-boot-testing - 6. Unit Testing With @WebMvcTest
В итоге, так как для интеграционных тестов необходимо использовать @SpringBootTest
, то я решил создать еще один тест, но для проверки добавления элемента в БД. DoctorController.createDoctor и посмотреть как можно настроить SpringBootTest, чтобы он не сохранял при тестировании в основную БД.
После чего столкнулся с ошибкой 403 при попытке теста.
Использовал решение из https://github.com/95shuma/crm/issues/91#issuecomment-656297416 , но оно не помогло, так как данный пример создает новый токен, вместо использования созданного при тестировании через @SpringBootTest
Решением оказалось добавление в mockMvc.perform(post(url))
.with(csrf()) - https://stackoverflow.com/questions/25605373/unit-testing-controllers-with-csrf-protection-enabled-in-spring-security
Фактическое время для Sprint 7: 18 часов.
Основное время было уделено изучению тестов для @Controller
чтобы написать DoctorControllerTest. Изученный материал описан в комментариях выше.
Прошу перенести тикет на следующий спринт и пересмотреть тикет на обсуждении. Считаю необходимым закрыть текущий тикет (необходимо обсудить с командой) и перенести пункты 4, 5, 6, 7 в отдельные тикеты, так как каждый пункт требует отдельного подробного изучения материала и написания необходимых тестов.
После обсуждений с командой было решено пункту №4 и №5 выделить по отдельному тикету, в связи с большим объемом работ.
ApplicationContext нашего приложения:
Можно нажать и увидеть на символ рядом с наименованием тестового класса:
Фактическое время выполнения в Sprint 8 -> 30 мин Итог: Выполненные пункты: 1, 2, 3, 6 Не выполнены в данном тикете -> 4, 5, 7. Причины указаны выше. https://github.com/95shuma/crm/issues/91#issuecomment-659473408 ; https://github.com/95shuma/crm/issues/91#issuecomment-660665523
Для удобство пользователя
Создать тесты на измененные методы
10 часов