1. Куча / Говнокод #21894

    −66

    1. 1
    Говнокодеры, а как вы тестируете многопоточный код?

    Типа там как покрываете тестами синхронизацию потоков, схемы типа producer-consumer? Я вот ничего лучше долгих пауз в тестах не придумал для того, чтобы проверять, что блокировки работают. Ну или шатаю из нескольких потоков объект, который должен быть тредсейфным, а потом проверяю, что с ним все хорошо.
    Но это же все хуйня, потому что зависит от случая. А тесты должны быть детерминированными и быстрыми.
    Делитесь опытом.

    Запостил: g0cTb, 24 Декабря 2016

    Комментарии (10) RSS

    • показать все, что скрытоSEO-пост: #тесты #TDD #хайлоад #куча #мой #личный #форум
      Ответить
    • показать все, что скрытоНе может поведение многопоточного кода быть детерминированным by definition.
      Если там есть race, то у тебя тесты будут падать в зависимости от фазы луны.

      В теории можно запустить все под эмулятором, у которого шедулер и внешнее IO будут вести себя строго по правилам, и тем покрыть все кейзы, но на практике я такого не встречал.

      А потому пишутся достаточно высокоуровневые тесты, и гоняются нон-стоп на CI сервере. Рано или поздно что-то упадет.

      И потому:
      * Знать memory model своей машины на зубок
      * Знать средства для её синхронизации как отче наш
      * Ревью, ревью, ревью
      * Инспекции и статический анализ на предмет детских ошибок (для многих ЯП есть)
      Ответить
    • показать все, что скрытоПротестировали всем Камеруном многопоточность твоих дырочек, проверь.
      Ответить
    • показать все, что скрытоА ты хотел рейсы юниттестами отлавливать? Это вообще возможно?
      Ответить
    • показать все, что скрытоЕсли кресты, то можно использовать thread sanitizer. В address sanitizer такие ошибки тоже будут видны.
      https://www.youtube.com/watch?v=E36BUcTWo50
      Ответить
    • показать все, что скрытоC++ Concurrency in Action
      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
      http://www.bogotobogo.com/cplusplus/files/CplusplusConcurrencyInAction_PracticalMultithreading.pdf
      http://cloudate.net/wp-content/uploads/2015/02/Java-Concurrency-In-Practice.pdf
      Я обычно сочетаю брутфорс с тестированием свойств в стиле QuickCheck. Не всегда супер-надёжно, но даже простые тесты часто помогают найти кучу ошибок.
      Ответить

    Добавить комментарий