Можно попробовать что-то вроде:
quiz_sessions
--------------------
id | user_id | finished(bool) | created_at | finished_at
Где:
user_id: ID юзера который проходит тест
finished: закончил ли юзер прохождение
created_at: время создания сессии (начала тестирования)
finished_at: время завершения
Теперь, когда юзер начинает тест, создаем в БД новую запись quiz_sessions.
Если в БД уже есть НЕ законченная сессия, можно предложить юзеру продолжить прошлый тест с момента где он остановился.
Когда юзер заканчивает, обновляем запись в БД, и выставляем
finished &
finished_at.
Далее можно сделать скрикпт который по крону будет пробегаться по quiz_sessions и удалять записи у которых created_at > какого-то значения + можно удалять все ответы у юзера.
UPD:
В чем приемущество такого подхода:
Если мы не удаляем сессии которые не законченны, то мы можем делать выборку, и видеть сколько человек и кто конкретно начинал делать тест и не закончил. Мы можем отослать им уведомление или наказать.
Можно делать выборку и показывать статистику топого времени прохождения теста + среднее время + минимальное.
Можно ловить "читеров", если такие будут, которые будут проходить тест за 1 секунду.