Модульное тестирование потокового кода? Форсирование состояния гонки - PullRequest
8 голосов
/ 14 декабря 2010

При использовании моего приложения я наткнулся на условие гонки в некотором коде, который использует NSOperationQueue для асинхронного запуска задач после событий, инициируемых пользователем. Я знаю, как исправить состояние гонки, поскольку это глупая ошибка проектирования, в которую я не буду вникать, но я бы хотел доказать ошибку с помощью тестового примера (чтобы он не возвращался во время дальнейшей оптимизации / рефакторинга по линии). Это поставило меня в тупик. Как можно протестировать что-то многопоточное, особенно если целью теста является создание условия гонки?

Есть ли у кого-нибудь ссылки на справочные материалы, на которые я могу ссылаться, когда речь идет о работе с потоками и модульном тестировании? Меня особенно интересует генерация состояния гонки.

1 Ответ

4 голосов
/ 14 декабря 2010

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

Этого можно добиться с помощью дополнительной (условной) синхронизации или (более простых и менее надежных) дополнительных таймеров. Поместите несколько вызовов sleep () в критические секции, чтобы убедиться, что они выполняются достаточно долго, чтобы другой поток мог прийти в нежелательное состояние. Когда у вас это работает, замените спящие вызовы явной синхронизацией (то есть блокируйте один поток, пока другой фактически не подтвердит прибытие).

Затем сделайте все это условным для глобального флага, установленного в тестовом примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...