Информация об изменениях

Сообщение Re[2]: Юнит-тесты многопоточки от 08.11.2021 14:32

Изменено 08.11.2021 14:36 ·

Re[2]: Юнит-тесты многопоточки
Здравствуйте, Sharov, Вы писали:

S>Да тут вообще можно перебором (3!) все варианты запустить через соотв. thread.sleep. Т.е. завести массив целых

S>типа sleep = int[] {1000,2000,3000} и все перестановки для thread.sleep для каждого потока.
S>Т.е. генерируйте тройки перестановок и засыпайте потоки на соотв. время перед запуском соотв. метода.
За thread.sleep в авто-тестах я бы сразу no hire делал. Оно не только работает ужасно долго делая билд тормозным солидным, но и иногда ломается, когда вдруг где-то что-то засвопит при очередном тестовом прогоне и завалит билд.

Надо просто блокировать|разблокировать треды в нужном порядке. Это я исхожу из моего понимания задания — мол, second должен лочиться до тех пор пока не вызван first. Иначе не очень ясно что должен делать second в момент когда first уже работает.
Если же фейлы нужны, то непонятно зачем с тредами тестировать, всё гораздо проще. Использовать какой-нибудь потокобезопасный примитив для изменения state, да и всё:
class
{ 
    volatile bool firstDone;


    void doFirst() {
        doFirstStuff();
        firstDone = true;
    }

    void doSecond() {
        if(!firstDone) throw new IllegalState();
        doSecondStuff();
    }
  
}

Неужели действительно так _надо_ писать тест на наличие volatile?
Re[2]: Юнит-тесты многопоточки
Здравствуйте, Sharov, Вы писали:

S>Да тут вообще можно перебором (3!) все варианты запустить через соотв. thread.sleep. Т.е. завести массив целых

S>типа sleep = int[] {1000,2000,3000} и все перестановки для thread.sleep для каждого потока.
S>Т.е. генерируйте тройки перестановок и засыпайте потоки на соотв. время перед запуском соотв. метода.
За thread.sleep в авто-тестах я бы сразу no hire делал. Оно не только работает ужасно долго делая билд тормозным солидным, но и иногда ломается, когда вдруг где-то что-то засвопит при очередном тестовом прогоне и завалит билд.

Надо просто блокировать|разблокировать треды в нужном порядке. Это я исхожу из моего понимания задания — мол, second должен лочиться до тех пор пока не вызван first. Иначе не очень ясно что должен делать second в момент когда first уже работает.
Если же фейлы нужны, то непонятно зачем с тредами тестировать, всё гораздо проще. Использовать какой-нибудь потокобезопасный примитив для изменения state, да и всё:
class
{ 
    volatile bool firstDone;


    void doFirst() {
        doFirstStuff();
        firstDone = true;
    }

    void doSecond() {
        if(!firstDone) throw new IllegalState();
        doSecondStuff();
    }
  
}

Неужели действительно так _надо_ писать тест на наличие volatile?

Честно говоря, я себе слабо представяю как написать _надёжный_ тест, который тестирует что переменная помечена volatile.