2009-10-21 3 views
1

Я реализовал семафоры FIFO, но теперь мне нужен способ проверить/доказать, что они работают правильно. Простым тестом было бы создать некоторые потоки, которые будут пытаться ждать на семафоре, а затем распечатать сообщение с номером, и если номера в порядке, то это должен быть FIFO, но это недостаточно для того, чтобы доказать это, потому что этот порядок может иметь произошли случайно. Таким образом, мне нужен лучший способ тестирования.
При необходимости могут использоваться замки или переменные условия.
ThanksFIFO semaphore test

ответ

-2

потому что этот заказ мог произойти случайно.

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

P.S. Как правило, избегают множественных потоков в единичном тесте

+0

«Несколько потоков в единичном тесте обычно избегают» - ??? Если код, который вы тестируете (например, семафор), может быть протестирован только с несколькими потоками. – jlstrecker

+0

Запуск чего-то несколько раз с правильным выходом не гарантирует, что он правильный. – Eric

4

Что вы описываете с предложением «, но этого недостаточно, чтобы доказать это, потому что этот заказ мог произойти случайно?« это как-то известная дилемма.

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, чтобы еще больше рандомизировать выполнение теста. Если ваши тесты всегда проходят, ну, вы можете быть уверены, что ваш код хорош.