- 1
Говнокодеры, а как вы тестируете многопоточный код?
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−66
Говнокодеры, а как вы тестируете многопоточный код?
Типа там как покрываете тестами синхронизацию потоков, схемы типа producer-consumer? Я вот ничего лучше долгих пауз в тестах не придумал для того, чтобы проверять, что блокировки работают. Ну или шатаю из нескольких потоков объект, который должен быть тредсейфным, а потом проверяю, что с ним все хорошо.
Но это же все хуйня, потому что зависит от случая. А тесты должны быть детерминированными и быстрыми.
Делитесь опытом.
g0cTb 24.12.2016 18:02 # −68
barop 24.12.2016 18:12 # −65
Если там есть race, то у тебя тесты будут падать в зависимости от фазы луны.
В теории можно запустить все под эмулятором, у которого шедулер и внешнее IO будут вести себя строго по правилам, и тем покрыть все кейзы, но на практике я такого не встречал.
А потому пишутся достаточно высокоуровневые тесты, и гоняются нон-стоп на CI сервере. Рано или поздно что-то упадет.
И потому:
* Знать memory model своей машины на зубок
* Знать средства для её синхронизации как отче наш
* Ревью, ревью, ревью
* Инспекции и статический анализ на предмет детских ошибок (для многих ЯП есть)
TPAXHY_B_AHYC 24.12.2016 18:26 # −67
3_14dar 24.12.2016 18:27 # −68
TPAXHY_B_AHYC 24.12.2016 19:08 # −67
inkanus-gray 24.12.2016 20:53 # −62
TPAXHY_B_AHYC 25.12.2016 20:05 # −66
crastinus 24.12.2016 22:18 # −66
https://www.youtube.com/watch?v=E36BUcTWo50
g0cTb 24.12.2016 23:02 # −66
roman-kashitsyn 24.12.2016 23:08 # −61
10.2.4 Multithreaded testing techniques
* BRUTE-FORCETESTING The idea behind brute-force testing is to stress the code to see if it breaks. This typically means running the code many times, possibly with many threads running atonce.
...
* COMBINATION SIMULATION TESTING The idea is that you runyour code with a special piece of software that simulates the real runtime environmentof the code.
...
* DETECTING PROBLEMS EXPOSED BY TESTS WITH A SPECIAL LIBRARY
Although this option doesn’t provide the exhaustive checking of a combination simulation test, you can identify many problems by using a special implementation of the library synchronization primitives such as mutexes, locks, and condition variables.
Рекомендую ещё посмотреть Java Concurrency in Practice, глава 12 Я обычно сочетаю брутфорс с тестированием свойств в стиле QuickCheck. Не всегда супер-надёжно, но даже простые тесты часто помогают найти кучу ошибок.