Жесткий действительно! В моем (C++) модульные тесты я разломал это на несколько категорий вроде используемого шаблона параллелизма:
Модульные тесты на классы, которые работают в единственном потоке и не ориентированы на многопотоковое исполнение - легкий, протестируйте, как обычно.
Модульные тесты на объекты Монитора (те, которые выполняют синхронизированные методы в потоке вызывающих сторон управления), которые представляют синхронизируемый общедоступный API - инстанцируют нескольких ложных потоков, которые осуществляют API. Создайте сценарии, которые осуществляют внутренние условия пассивного объекта. Включайте один более длинный запускающий тест, который в основном бьет heck из него от нескольких потоков в течение длительного периода времени. Это является ненаучным, я знаю, но это действительно создает атмосферу доверия.
Модульные тесты на Активные объекты (те, которые инкапсулируют их собственный поток или потоки управления) - подобный № 2 выше с изменениями в зависимости от дизайна класса. Общедоступный API может блокироваться или не блокироваться, вызывающие стороны могут получить фьючерсы, данные могут прибыть в очереди или должны быть исключены из очереди. Существует много комбинаций, возможных здесь; белое поле далеко. Все еще требует, чтобы несколько ложных потоков выполнили вызовы к объекту под тестом.
Как в стороне:
Во внутреннем обучении разработчика, которое я делаю, я преподаю Столбы Параллелизма и эти два шаблона как основная платформа для размышления об и разложения проблем параллелизма. Там, очевидно, больше усовершенствовал понятия там, но я нашел, что этот набор основ помогает не допустить инженеров в суп. Это также ведет для кодирования, который является большей тестируемой единицей, как описано выше.
Кажется, что векторы не являются разреженными, поэтому вы должны указать значение для каждого индекса при создании вектора. Кажется, самый простой способ - вызвать (vec) последовательность.
(vec (repeat 1042 nil))
Кажется, эти ценности не создаются лениво.
Если вам нужно что-то не ленивое, но позволяющее избежать накладных расходов, вы можете сделать:
(vec (make-array Object 1024))
Обратите внимание, assoc
не изменяет вектор, он возвращает новый вектор. при изменении одного из значений. Векторы неизменны. Ваш код никогда не будет работать так, как было опубликовано.