|
|
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
Добрый день! У меня есть класс, UserDAO , у которого есть метод getUserList() , который возвращает список всех пользователей, которые есть в базе. И еще есть сервис UserService , который выглядит ориентировочно так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. Мне нужно протестировать, что при имеющемся фиксированном userList, метод, например, getUserBySomeFilter возвращает правильный список пользователей. Дело в том, что этот класс (UserService) может использоваться в каком-то тесте, и там например будет вызвана операция add или delete, и тогда я уже не могу гарантировать, что состояние UserService неизменно между вызовами getUserList и getUserListByFilter. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 06:07:25 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
Во-1, метод List<User> getUserList() вполне мог бы возвращать userList - не обязательно ещё один объект создавать. Во-2, когда коллекция активно используется для добавления и удаления элементов, использовать ArrayList не эффективно - при превышении количества "ячеек" под элементы, созданных при инициализации (кажется по умолчанию 5), ArrayList каждый раз пересоздается при добавлении нового элемента. То есть лучше использовать для этого LinkedList. В-3, из вопроса о "правильном списке пользователей" непонятны критерии правильности. Не пустой? - assertNotNull. Содержит определённое количество элементов? - assertEquals(expectedCount, userList.size()). Интересует точное совпадение списков до буквы? - перевести в массивы и вызвать assertArrayEquals. В-4, про "состояние UserService" можно не беспокоиться. JUnit не только запускает каждый тест в виде отдельного приложения, но и, вроде бы, отдельным класслоадером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 07:09:57 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
mesier, О_о то есть объект UserService уже не гарантированный singleton для разных тестов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 07:22:00 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
scymaksmesier, О_о то есть объект UserService уже не гарантированный singleton для разных тестов? Чиво-чиво?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 08:05:24 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
mesier, Ну вот есть допустим два теста: UserServiceTest и HotelServiceTest и типа они выглядят вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 08:25:21 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
scymaks выглядят вот так: Хорошо выглядят.. ))) А вопрос (проблема) в чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 08:48:05 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
mesier, ну они оба могут использовать метод add у объекта userService Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 11:21:34 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
Так ты что ли в юнит-тестах с реальными данными работаешь, в БД лазиешь? ))) Порядочные разработчики все классы persistence-слоя мокают, а методы - стабят! А что будет если твои классы отдать тестеру, у которого нет доступа к БД? Для затравочки: Mockito Первое правило юнит-тестирования - тестируем поведение а не код! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 13:52:59 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
офф: вообще не работал с тестированием и не понимаю для чего оно нужно :) Если вкратце, очень вкратце - оно зачем вообще? Можно ссылкой, но лучше так, на пальцах )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 13:57:49 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
Nixicофф: вообще не работал с тестированием и не понимаю для чего оно нужно :) Если вкратце, очень вкратце - оно зачем вообще? Можно ссылкой, но лучше так, на пальцах )) О_о Заканчивается 2012 год, ребята!.. ))) Пример (утрировано): разработчику компьютерной игры понадобилось протестировать и отладить битву с Главным Монстром, когда и сам персонаж уже стал прокачанным эльфом 80-го уровня. Сколько времени понадобится на компиляцию, сборку, возможно установку, и прохождение игры, для того чтобы проверить как работает нужное место программы? Будет ли проект сдан вОвремя? Скандалы-интриги-расследования.. Логично выглядит проверка работы отдельно от всей игры этого места программы с возможностью задать какие-то параметры выполнения. Это и есть модульное тестирование. Модульное тестирование доступно только программисту - только он знает какие методы вызываются в том или ином месте программы, какие параметры должны им передаваться, их диапазон значений, и какой результат при этом ожидается на выходе из метода. Язык Java дает нам замечательную возможность - мы можем в любом классе создать экземпляр другого класса и выполнить его методы.. Это и будет примитивный юнит-тест. Библиотеки же для юнит-тестирования дают расширенные возможности - моки, стабы, ассерты. Причем, JUnit, как говорят, ещё не самый удобный.. Юнит-тестирование, TDD, если его изучить настолько хорошо, что на написание теста для метода будет уходить не более 10-20 минут, существенно сокращает время отладки, оччень экономит нервные клетки при дальнейшем функциональном тестировании! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 14:18:58 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
Nixicс тестированием и не понимаю для чего оно нужно букварик типа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 15:24:28 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
Nixic, На самом деле ты работаешь с тестами постоянно. Ты пишешь код, запускаешь программу и смотришь, работает она или нет. И так до релиза у тебя в main() находится главный и единственный тест твоей программы Пока ты в угаре и помнишь проект наизусть, этого может хватать. Но чтоьы не держать все в голове, и быстро получать отчет о том что работает а что сломалось, придуманы юнит-тесты. Тест воссоздает рабочую ситуацию и дает информацию о работоспособности компонент системы. В общем это какбы отдельные main на разные случаи жизни, может так легче понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 15:29:27 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
ЛагманNixic,... Но чтоьы не держать все в голове, и быстро получать отчет о том что работает а что сломалось, придуманы юнит-тесты. Тест воссоздает рабочую ситуацию и дает информацию о работоспособности компонент системы. В общем это какбы отдельные main на разные случаи жизни, может так легче понять. Вооот, вот это полезная вещь! А то поменяешь что-то, то тут то там, и то, что делал два месяца назад уже могло и "полететь"... Спасибо ВСЕМ за инфу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 15:41:51 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
mesierВо-1, метод List<User> getUserList() вполне мог бы возвращать userList - не обязательно ещё один объект создавать. таким образом автор отдаст во внешний код "реальную" коллекцию с данными, которую внешний код может испортить самостоятельно. имхо копирование к месту. но вот к месту ли такой кэш в памяти, когда есть бд - уже вопрос :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 00:29:33 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
marx_freedom, мое дело не оценивать код, а написать к нему тесты :) mesier Так ты что ли в юнит-тестах с реальными данными работаешь, в БД лазиешь? ))) Порядочные разработчики все классы persistence-слоя мокают, а методы - стабят! А что будет если твои классы отдать тестеру, у которого нет доступа к БД? Для затравочки: Mockito Первое правило юнит-тестирования - тестируем поведение а не код! Я вот не очень понимаю до конца суть тестирования поведения видимо. Поясните пожалуйста, вот скажем есть у нас это userList и есть два метода, например такие: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 05:58:25 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
Дело этих геттеров - возвращать данные. А вот есть ещё там какой-то filter - его дело фильтровать. Вот и надо проверять, что геттер возвращает, а фильтр фильтрует.. )) (подсунув какие-то придуманные данные на вход, чтобы убедиться, что оно всё фильтрует и возвращает именно так, как мы того хотим) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 07:55:33 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
mesier, ну я так понимаю тест код будет проверять, что 1. вызывался метод accept 2. и если метод accept вызывался и вернул true, то должен был вызываться add у списка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 09:22:01 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
scymaksmesier, ну я так понимаю тест код будет проверять, что 1. вызывался метод accept 2. и если метод accept вызывался и вернул true, то должен был вызываться add у списка? Как вариант.. Но не проще ли проверить, что в ответ на загруженный в тест-класс список сферических условных пользователей Иванов-Петров-Сидоров-Пидоров: 1) userList не пуст и в нем все четверо; 2) accept() возвращает true или false тогда, когда это надо; 3) метод getUserListByFilter() вернул Иванова-Петрова, а второй Сидорова - то есть так, как это и ожидалось. (к примеру! я ж не знаю как там фильтры фильтруют их) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 10:21:33 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
mesier, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2012, 08:56:19 |
|
||
|
Junit Services Тестирование метода
|
|||
|---|---|---|---|
|
#18+
mesierТак ты что ли в юнит-тестах с реальными данными работаешь, в БД лазиешь? ))) Смотря что тестируется. Если тестируется DAL - то да, именно в БД и ходим. Если тестируется слой сервис, то конечно же все DAO заменяются моками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2012, 12:24:54 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37924491&tid=2131097]: |
0ms |
get settings: |
14ms |
get forum list: |
20ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
64ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
| others: | 331ms |
| total: | 545ms |

| 0 / 0 |
