В настоящее время я работаю над приложением Rails (интерфейс React), которое занимается студентами, отправляющими заархивированные каталоги проектов Ruby. Файлы хранятся через Paperclip и S3 на модели Assessment. В настоящее время, чтобы оценивать представленные студентами материалы, я должен загрузить файл каждого студента и протестировать его с помощью RSpec индивидуально из командной строки.
Я улучшил рабочий процесс, написав сценарий командной строки (на Ruby), который будет брать каталог Zip-файлов, оценивать их все сразу и сохранять каждый отдельный вывод RSpec в файле scores.txt.
Цель состоит в том, чтобы позволить учащимся загружать свои .zip-файлы через портал и сразу же автоматически тестировать их с помощью RSpec. Есть ли способ сделать это?
Я провел много поисков и пока могу найти только советы о том, как тестировать ввод данных пользователем в реальном времени (аналогично codecademy или другим сайтам со встроенными IDE).





Конечно, это выполнимо.
Разархивируйте файл, загрузите каждый файл и запустите тесты для определенных методов / классов.
Но нужно учесть как минимум две вещи ...
Студент может перезаписать ваш метод test, чтобы возвращать только хорошие оценки, или случайные, или что-то еще. Потому что вы в основном загружаете их код в тот же процесс, который их оценивает. Вы, конечно, можете сделать имена методов неочевидными, но безопасность через безвестность просто скрещивает пальцы и надеется, что ему повезет (например, студент может создать сценарий, который загружает ваш исходный код куда-нибудь для проверки позже)
Я бы решил это с помощью небольшого API, который берет код, исходный файл, метод для вызова и возвращает результат. Таким образом, вместо загрузки файла в ваше пространство - вы просите отдельное приложение производить вывод, и в вашем основном приложении он будет оценивать / обрабатывать его.
то есть один студент может перезаписать определение Object.to_s, а другие будут использовать его, думая, что это исходная реализация, что приведет к тому, что их код не сможет произвести желаемый результат.
Решением этого было бы запускать каждый тест в отдельном процессе (а не только в потоке).
Это, к сожалению, возвращает нас к безопасности - каждый скрипт сможет читать и изменять код, доступный для приложения, которое его запускает.
Самое простое, что я могу придумать прямо сейчас, - это запустить контейнер (например, докер, ракету или другой) и запустить там код. Дополнительным преимуществом было бы то, что вы можете поделиться образом контейнера с учащимися, и они смогут запускать свой код в той же среде, делая результаты настолько согласованными, насколько вы можете себе представить.
Если файл быть оцененным является проектом рельсов, может быть, я мог бы создать совершенно новый контейнер Docker только для настройки этого проекта?
Я полагаю, вы ожидаете, что студенты определят метод foo (или как вы его называете, но они должны его реализовать). И вы говорите: foo(x) производит false, когда x>0, и true в противном случае. Затем, чтобы проверить это, вам потребуется файл ученика, вызовите метод foo и проверьте результат. Ofc. вы можете использовать обратные кавычки или System.exec, чтобы легко распаковать его. Если вам нужна помощь с реализацией, вы должны начать внедрять и искать / задавать конкретные вопросы по SO.
Спасибо за мысли, это звучит действительно полезно! Пара дополнений: 1 Вы имеете в виду просто вызов методов Ruby
Fileвнутри моделиAssessment? Я мог бы использовать обратные кавычки (например,`unzip filename.zip`) для выполнения команд, подобных bash. 2. Было бы возможно, если бы тестируемые файлы были файлами Rails? (который включает в себя тестовую базу данных)