Я реализовал семафоры FIFO, но теперь мне нужен способ проверить/доказать, что они работают правильно. Простым тестом было бы создать некоторые потоки, которые будут пытаться ждать на семафоре, а затем распечатать сообщение с номером, и если номера в порядке, то это должен быть FIFO, но это недостаточно для того, чтобы доказать это, потому что этот порядок может иметь произошли случайно. Таким образом, мне нужен лучший способ тестирования.
При необходимости могут использоваться замки или переменные условия.
ThanksFIFO semaphore test
ответ
потому что этот заказ мог произойти случайно.
Вы можете выполнить тест несколько раз, например. 10, и проверьте, чтобы каждый раз, когда порядок был правильным. Это гарантирует, что это произошло не случайно.
P.S. Как правило, избегают множественных потоков в единичном тесте
Что вы описываете с предложением «, но этого недостаточно, чтобы доказать это, потому что этот заказ мог произойти случайно?« это как-то известная дилемма.
1) Даже если у вас есть спецификации, вы не можете гарантировать, что спецификация соответствует вашей намерения. Чтобы проиллюстрировать это, я приведу пример от "the limit of correctness". Давайте рассмотрим спецификацию для функции факторизации, которая:
Compute А и В таких, как A * B = C
Но это не достаточно, как вы могли бы иметь реализацию, которая возвращает A=1
и B=C
. Добавление A,B != 1
может по-прежнему приводить к A=-1
и B=-C
, поэтому только правильная спецификация должна указывать A,B>1
. Это просто, чтобы проиллюстрировать, насколько сложно создать спецификацию, которая соответствует реальному намерению.
2) Даже при наличии доказал алгоритм, еще не означает, что реализация правильно на практике. Это лучше всего иллюстрируется this quote от Дональда Кнута:
Остерегайтесь ошибок в приведенном выше коде; I доказали это правильно, не пробовали it.
3) Тестирование может только выявить Присутствия Буга, а не их отсутствие. Эта цитата восходит к Dijkstra:
Тестирование может быть использовано, чтобы показать наличия ошибок, но никогда не показывать их отсутствия.
Заключение: вы обречены, и вы никогда не будете на 100% уверены, что ваш код правильный в соответствии с его намерением! Но все не так уж плохо.Имея высокий доверие о коде, как правило, достаточно. Например, если использовать несколько потоков по-прежнему недостаточно для вас, вы также можете использовать fuzzing, чтобы еще больше рандомизировать выполнение теста. Если ваши тесты всегда проходят, ну, вы можете быть уверены, что ваш код хорош.
- 1. C++ реализация semaphore самостоятельно
- 2. FIFO code описание
- 3. Win32 Uderstanding semaphore
- 4. Win32 Event vs Semaphore
- 5. Условная переменная vs Semaphore
- 6. pthreads mutex vs semaphore
- 7. Windows Semaphore и QSystemSemaphore
- 8. Blackberry Semaphore class
- 9. Python threading and semaphore
- 10. Вызов изнутри lock/semaphore
- 11. boost semaphore cause segfault
- 12. Multithread Semaphore java
- 13. GCD Semaphore не ждет (Swift)
- 14. Linux inter-process reentrant semaphore
- 15. mutex/lock/semaphore в SML
- 16. C - Linux - Pthreads and Semaphore
- 17. Секция кода с N потоками, выполняющимися в заказе FIFO
- 18. Двунаправленный FIFO
- 19. реализация FIFO
- 20. Nonblocking fifo
- 21. Модуль NodeJS Semaphore: как он работает?
- 22. Создать с именем Mutex-Semaphore в Java
- 23. java.util.NoSuchElementException при запуске с помощью Semaphore
- 24. ipcs -s, не показывающий named semaphore
- 25. Код с использованием Thread и Semaphore
- 26. Домашнее задание - читатель написать appender semaphore
- 27. Несколько читателей из FIFO
- 28. Соединительный разъем и трубка FIFO
- 29. reify test test test
- 30. FIFO to grep to file
«Несколько потоков в единичном тесте обычно избегают» - ??? Если код, который вы тестируете (например, семафор), может быть протестирован только с несколькими потоками. – jlstrecker
Запуск чего-то несколько раз с правильным выходом не гарантирует, что он правильный. – Eric