powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как написать тесты на экзекутор ?
7 сообщений из 32, страница 2 из 2
Как написать тесты на экзекутор ?
    #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
7 сообщений из 32, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как написать тесты на экзекутор ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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