powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как написать тесты на экзекутор ?
32 сообщений из 32, показаны все 2 страниц
Как написать тесты на экзекутор ?
    #39511830
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дали задачку написать класс который исполняет задачи. Он может это делать параллельно в некоторых случаях, а в некоторых случаях это запрещено.

Просят написать тесты на эту функциональность. Что-то у меня в голове пазл не сходится как это сделать.

Понятно, что имплементацию таски пишу я сам, но как оттестировать тот факт, что некоторые таски не исполнялись параллельно
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39511942
Andrei T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Совсем недавно такое делал, глянь здесь . Проверка, что жобы выполнялись последовательно называется assertExecutedInOrder, использует время начала и окончания выполнения каждого жоба (начало выполнения следующего должно быть не раньше окончания предыдущего). Подразумевается, что каждый жоб сам умеет отдать эти два параметра, но в принципе можно их регистрировать независимо в экзекуторе или каком-нибудь листенере.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39511949
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerДали задачку написать класс который исполняет задачи. Он может это делать параллельно в некоторых случаях, а в некоторых случаях это запрещено.

Просят написать тесты на эту функциональность. Что-то у меня в голове пазл не сходится как это сделать.

Понятно, что имплементацию таски пишу я сам, но как оттестировать тот факт, что некоторые таски не исполнялись параллельно

Вы бы не могли уточнить Вам не сказали как это имплементировать через JUnit, Mock или BDD?

На мой взгляд Вам надо написать сценарии на огурце и прогнать их походу когда проект встанет используя типо  REST API.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39511972
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerПонятно, что имплементацию таски пишу я сам, но как оттестировать тот факт, что некоторые таски не исполнялись параллельно

Семафор какой-нибудь. Пушишь две "непараллельные" таски. Одна блочит семафор и спит (условную) секунду. Вторая в течении той же (условной) секунды проверяет, что семафор свободен.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39511991
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerДали задачку написать класс который исполняет задачи. Он может это делать параллельно в некоторых случаях, а в некоторых случаях это запрещено.

Просят написать тесты на эту функциональность. Что-то у меня в голове пазл не сходится как это сделать.

Понятно, что имплементацию таски пишу я сам, но как оттестировать тот факт, что некоторые таски не исполнялись параллельно
Парень. Такое не тестят обычно. Тестят логику. Там где хотя-бы число состояний счетно.
В параллельном коде число состояний - умножается. Плюс вводятся новые состояния
связанные с ожиданиями. Вобщем протестировать параллельный код настолько
сложно что лучше этим не заниматься. Только очковтирательство получится.

Если ты сможешь - то вынеси логику в отдельный черный ящик и протестируй ее. Без мультипоточности.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512044
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПарень. Такое не тестят обычно. Тестят логику. Там где хотя-бы число состояний счетно.
В параллельном коде число состояний - умножается. Плюс вводятся новые состояния
связанные с ожиданиями. Вобщем протестировать параллельный код настолько
сложно что лучше этим не заниматься. Только очковтирательство получится.

Тестится. Я ловил в тестах ошибку.
Да, надо понимать, что вероятность упасть при ошибке не 100%, но т.к. CI гоняет их постоянно- то проблемы обычно всплывают. Правда надо внимательно писать, чтобы не поймать лишних ошибок.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512056
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш тест скорее всего настолько сложен что его тоже надо покрыть тестами
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512149
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лол. убил. тольо что сказал своему коллеге тоже самое про его мегатесты. )))
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512276
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerПросят написать тесты на эту функциональностьТут только интеграционный тест
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512353
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВаш тест скорее всего настолько сложен что его тоже надо покрыть тестами


Не ударжелся, написал .
Г@внокод, понятное дело. Ну да, мозги надо включать и с первого раза не заработает - ну так красные ленточки на входе были
Если поправить код около "//!!!" тут и тут то можно словить ошибки.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512467
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominmaytonВаш тест скорее всего настолько сложен что его тоже надо покрыть тестами


Не ударжелся, написал .
Г@внокод, понятное дело. Ну да, мозги надо включать и с первого раза не заработает - ну так красные ленточки на входе были
Если поправить код около "//!!!" тут и тут то можно словить ошибки.
Спасибо. Я даже более скажу. У меня есть аналогичный код в тестах со sleep(..).
Но он не для мультипоточности а для JMS(Apache MQ). Дело в том что в некоторых
тестах в силу особенностей технологии нет синхронного assert. Все - асинхронные.
Стоишь как дурак и ждёшь. Придёт месседж или нет? Если не пришел сразу - то не факт
что fail(). Просто надо еще пол-минутки подождать.

Вот таков он этот JMS.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512566
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня есть аналогичный код в тестах со sleep(..).
Но он не для мультипоточности а для JMS(Apache MQ). Дело в том что в некоторых
тестах в силу особенностей технологии нет синхронного assert. Все - асинхронные.
Стоишь как дурак и ждёшь. Придёт месседж или нет? Если не пришел сразу - то не факт
что fail(). Просто надо еще пол-минутки подождать.

Вот таков он этот JMS.

Чем дальше, тем больше прихожу к убеждению, что JMS используется намного больше, чем нужно. И даже можно.
Очередь/топик нужны только когда ответ вообще не нужен. Во всех остальных случаях есть инструменты и подходы лучше. Типа REST/gRPC и nginx/consul/костыли_в_mesos/... для отказа от конфигов.
Если надо ждать ответа от очереди- значит архитектор идиот.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512577
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЧем дальше, тем больше прихожу к убеждению, что JMS используется намного больше, чем нужно. И даже можно.
Очередь/топик нужны только когда ответ вообще не нужен. Во всех остальных случаях есть инструменты и подходы лучше. Типа REST/gRPC и nginx/consul/костыли_в_mesos/... для отказа от конфигов.
Если надо ждать ответа от очереди- значит архитектор идиот.
Нет. У нас JMS реально нужен. :) Для нашей системы это natural way.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39512639
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ нас JMS реально нужен. :) Для нашей системы это natural way.

Тогда зачем тестировать ответ?
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513008
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тестируем потому что требование заказчика. Тесты - ендпоинт. То есть тестится не какой-то модуль а
Полный цикл работы приложения. Начиная от того как jms сообщение зашло.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513107
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТестируем потому что требование заказчика. Тесты - ендпоинт. То есть тестится не какой-то модуль а
Полный цикл работы приложения. Начиная от того как jms сообщение зашло.

Ну это как раз интеграционные тесты. А на subj можно и unit
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513116
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш тест не тестирует параллельной работы.

По сути он просто утверждает что экзекютор когда нибудь остановится.

И из него не очевидно что какая то работа была выполнена.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513127
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плюсую, что тестировать параллельную работу это не черный ящик со входом выход тестировать.
Предмет теста не простой).
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513182
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВаш тест не тестирует параллельной работы.

Поставь один поток- тест упадёт. Значит тестирует.

maytonПо сути он просто утверждает что экзекютор когда нибудь остановится.
И из него не очевидно что какая то работа была выполнена.

Да, надо дописать в конце выполнения установку флага.
Там тестируется две вещи- задачи одной группы выполняются последовательно, разных- параллельно. Так было в первом сообщении. Больше ничего не тестировал. Да собственно и не надо- там внутри тредпулэкзекьютор, его тестировать не надо.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513193
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай порассуждаем. В чем смысл этого экзекютора. Не вникая в детали твоих групп и прочих категорий.

Я утверждаю что существует момент времени t _когда хотябы два потока работали одновременно.

Это главный поинт и его надо тестировать. Без него этот экзекютор фейк и его работу можно было сэмулировать
Как последовательную.

Как проверить параллельную работу? Вопрос достойный отдельного топика.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513196
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавай порассуждаем. В чем смысл этого экзекютора. Не вникая в детали твоих групп и прочих категорий.

Я утверждаю что существует момент времени t _когда хотябы два потока работали одновременно.

Это главный поинт и его надо тестировать. Без него этот экзекютор фейк и его работу можно было сэмулировать
Как последовательную.

Как проверить параллельную работу? Вопрос достойный отдельного топика.

Всё просто. Каждая задача выполняется секунду. У нас 5 задач. Через 1.5 секунды в очереди нет задач- значит параллельная работат есть.
Проверим. Сделаем всё в один поток - получим падение теста. Значит проверка есть.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513200
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется критерий потраченного времени - плохой советчик.

Ведь в реальности потока не стоят в sleep а исполняют работу?

Нужен пруф работы
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513240
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМне кажется критерий потраченного времени - плохой советчик.

Ведь в реальности потока не стоят в sleep а исполняют работу?

Нужен пруф работы

Зачем? А если тест гоняется на древнем одноядерном процессоре, то он упадёт, что ли?
В реальности всё одно потоки ждут обычно- обычно сеть, или диск. В крайнем случае память. Загрузить ядро работой даже на 50%- это большая удача.

Не надо ударяться в софистику. стоит вполне конкретная задача топикстартера. Этот тест её решает.

Я писал код, в котором, к примеру, можно было выполнять к серверу не более 5 запросов в секунду, при этом ответы были медленные, поэтому работало 30 потоков.
Тесты были, первоначальные ошибки поймали, потом код работал сутками и ограничения не превышал. Так что тесты писать можно. Было бы желание.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513412
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продвинутые люди сказали, что надо писать тесты на jcStress
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513465
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerПродвинутые люди сказали, что надо писать тесты на jcStress

Классная штука.
Но, насколько я понял, это black-box тест. Если так, то это не замена, а дополнение самописным тестам.
white-box тестирование тоже нужно делать.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513638
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте и я изложу своё ИМХО.

С интеграционными тестами всё более-менее и так понятно, поднимаем любимую реализацию JMS локально и тестируем.

Про многопоточные юнит тесты.

Первая и самая унылая категория - напихать многопоточный код ассертами и выполнять его в многопоточной среде, пока что-нибудь не сломается. Дешево, сердито и рассматривать тут нечего - такие тесты долго идут, жрут цпу и ничего не гарантируют.

Вторая - тестирование многопоточного кода в одном потоке. Как известно, при выполнении корректно синхронизированного многопоточного кода он разворачивается в так называемый synchronization order, в котором операции идут строго последовательно. Поэтому правильный тест многопоточного кода должен тестировать конкретные synchronization orders.

Как этого добиться? Нужно в своем коде избавиться от:
- Thread.sleep
- wait/notify
И вместо этого использовать ScheduledExecutor. Запустить два куска кода параллельно? Загрузите обе таски в екзекутор. Запустить их последовательно? Загрузить в екзекутор первую таску и в конце её загрузить вторую. Нужно сделать паузу? Загрузить таску в SheduledExecutor с нужной задержкой. Нужна более сложная система координации тасок? ConcurrentLinkedQueue<Runnable> в помощь.

Всё это нужно писать на скале или хотя бы на джаве с CompletableFuture.

Тестировать такой многопоточный код можно, просто сделав мок экзекутора, который будет запускать свои таски в нужном для теста порядке.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513683
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scfВторая - тестирование многопоточного кода в одном потоке. Как известно, при выполнении корректно синхронизированного многопоточного кода он разворачивается в так называемый synchronization order, в котором операции идут строго последовательно.

Извините, но это бред.

[/quote]И вместо этого использовать ScheduledExecutor. Запустить два куска кода параллельно? Загрузите обе таски в екзекутор. Запустить их последовательно? Загрузить в екзекутор первую таску и в конце её загрузить вторую. Нужно сделать паузу? Загрузить таску в SheduledExecutor с нужной задержкой. Нужна более сложная система координации тасок? ConcurrentLinkedQueue<Runnable> в помощь.

Всё это нужно писать на скале или хотя бы на джаве с CompletableFuture.

Тестировать такой многопоточный код можно, просто сделав мок экзекутора, который будет запускать свои таски в нужном для теста порядке.[/quote]


Во-первых у ScheduledExecutor'а есть вариант однопоточной работы.
Во-вторых ничего вы так не поймаете.
Вот, к примеру, последняя ошибка в многпоточном коде, которую я поймал, была связана с тем, что после выполнения задачи выполнялось две операции- запись в mongo статуса задачи и удаление из map'ы в памяти. Именно в таком порядке.
Иногда (ОЧЕНЬ иногда) другой (из 30, ага) поток успевал схватить свободную задачу и записать в map'у. После этого первый поток удалял задачу из map'ы и второй потом выдавал exception (т.к. в map'е нет его задачи).
Тест автор кода поленился написать. Искали ошибку долго (тем более, что на 20 нодах с 30 потоков каждая ошибка случалась раз в сутки). Но тест (который падал) я, когда нашёл ошибку, написать смог
А Ваш вариант не найдёт такую ошибку никогда.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513691
Andrei T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scfТестировать такой многопоточный код можно, просто сделав мок экзекутора, который будет запускать свои таски в нужном для теста порядке.
Отличное предложение, особенно учитывая, что автору именно экзекутор и надо тестировать.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513704
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei TscfТестировать такой многопоточный код можно, просто сделав мок экзекутора, который будет запускать свои таски в нужном для теста порядке.
Отличное предложение, особенно учитывая, что автору именно экзекутор и надо тестировать.Тут нужно учитывать один очень важный момент: тема вопроса, в большинстве случаев, редко совпадает с тем, что описано в первом посте.
имховое имхо
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513720
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЗачем? А если тест гоняется на древнем одноядерном процессоре, то он упадёт, что ли?
В реальности всё одно потоки ждут обычно- обычно сеть, или диск. В крайнем случае память. Загрузить ядро работой даже на 50%- это большая удача.

Не надо ударяться в софистику. стоит вполне конкретная задача топикстартера. Этот тест её решает.

Я писал код, в котором, к примеру, можно было выполнять к серверу не более 5 запросов в секунду, при этом ответы были медленные, поэтому работало 30 потоков.
Тесты были, первоначальные ошибки поймали, потом код работал сутками и ограничения не превышал. Так что тесты писать можно. Было бы желание.
Ну... этот курьез можно рассматривать как исключение их правил.
Или как вполне себе нормальный кейс. Ваше приложение не способно
работать на одноядерном процессоре.

По сабжу я все таки настаиваю на том что тесты надо писать на функционал
а не на шаблоны мультизадачности.

Отдельная задача - тесты производительности. Но ведь то что написано в топике
таковыми не является. Верно?
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513721
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,

Следите за руками:
- тестируемый кусок кода добавляет задачи в executor
- если в коде нет wait/notify и задачи добавляются для исполнения "сразу", то можно считать, что они должны выполниться одновременно
- многопоточный тредпул может их выполнить в любом порядке
- тестовый executor должен их выполнить в *конкретном* порядке, указанном в тесте. Если есть тесты на все имеющие смысл порядки, то эти тесты покроют вашу ошибку с кешами.
- если некоторая задача после выполнения добавляет в executor другие задачи "сразу", то они участвуют в выборе порядка выполнения на общих основаниях
- задачи, добавленные через scheduled executor, рассматриваются после окончания выполнения задач, назначенных на "сейчас"

Примерно так.
...
Рейтинг: 0 / 0
Как написать тесты на экзекутор ?
    #39513870
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scfСледите за руками:
...
Примерно так.

Каждый тест должен что-то проверять. unit-тест проверяет конкретный небольшой кусок кода с минимальным объёмом не относящегося к делу кода.
Автору нужно проверить, что некоторый executor не выполняет одновременно задачи, которые это явно запрещают.
Т.е. нужно взять наш executor (именно тестируемый, а не какой-то другой), затем вложить в него набор задач (простейших, без побочного кода) и проверить, что при возможности исполнить задачи параллельно некоторые не будут работать одновременно.
Лучше проверить, что тест работает- для этого надо внедрить ошибку "все последовательно" и "всё параллельно" и увидеть, как тест упал (параллельность такое дело- там да, надо проверять правильность тестов).
То, что Вы написали не имеет отношения к делу- executor другой, а задачи те же. Зачем?
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как написать тесты на экзекутор ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]