Ruby on Rails - как запустить автоматические тесты для загруженного пользователем файла Ruby?

В настоящее время я работаю над приложением Rails (интерфейс React), которое занимается студентами, отправляющими заархивированные каталоги проектов Ruby. Файлы хранятся через Paperclip и S3 на модели Assessment. В настоящее время, чтобы оценивать представленные студентами материалы, я должен загрузить файл каждого студента и протестировать его с помощью RSpec индивидуально из командной строки.

Я улучшил рабочий процесс, написав сценарий командной строки (на Ruby), который будет брать каталог Zip-файлов, оценивать их все сразу и сохранять каждый отдельный вывод RSpec в файле scores.txt.

Цель состоит в том, чтобы позволить учащимся загружать свои .zip-файлы через портал и сразу же автоматически тестировать их с помощью RSpec. Есть ли способ сделать это?

Я провел много поисков и пока могу найти только советы о том, как тестировать ввод данных пользователем в реальном времени (аналогично codecademy или другим сайтам со встроенными IDE).

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
138
1

Ответы 1

Конечно, это выполнимо.

Разархивируйте файл, загрузите каждый файл и запустите тесты для определенных методов / классов.

Но нужно учесть как минимум две вещи ...

Безопасность

Студент может перезаписать ваш метод test, чтобы возвращать только хорошие оценки, или случайные, или что-то еще. Потому что вы в основном загружаете их код в тот же процесс, который их оценивает. Вы, конечно, можете сделать имена методов неочевидными, но безопасность через безвестность просто скрещивает пальцы и надеется, что ему повезет (например, студент может создать сценарий, который загружает ваш исходный код куда-нибудь для проверки позже)

Я бы решил это с помощью небольшого API, который берет код, исходный файл, метод для вызова и возвращает результат. Таким образом, вместо загрузки файла в ваше пространство - вы просите отдельное приложение производить вывод, и в вашем основном приложении он будет оценивать / обрабатывать его.

Стабильность результатов

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

Решением этого было бы запускать каждый тест в отдельном процессе (а не только в потоке).

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

Так! Что тогда делать?

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

Спасибо за мысли, это звучит действительно полезно! Пара дополнений: 1 Вы имеете в виду просто вызов методов Ruby File внутри модели Assessment? Я мог бы использовать обратные кавычки (например, `unzip filename.zip`) для выполнения команд, подобных bash. 2. Было бы возможно, если бы тестируемые файлы были файлами Rails? (который включает в себя тестовую базу данных)

RuboTrip 29.06.2018 20:05

Если файл быть оцененным является проектом рельсов, может быть, я мог бы создать совершенно новый контейнер Docker только для настройки этого проекта?

RuboTrip 29.06.2018 20:54

Я полагаю, вы ожидаете, что студенты определят метод foo (или как вы его называете, но они должны его реализовать). И вы говорите: foo(x) производит false, когда x>0, и true в противном случае. Затем, чтобы проверить это, вам потребуется файл ученика, вызовите метод foo и проверьте результат. Ofc. вы можете использовать обратные кавычки или System.exec, чтобы легко распаковать его. Если вам нужна помощь с реализацией, вы должны начать внедрять и искать / задавать конкретные вопросы по SO.

Grzegorz 30.06.2018 12:48

Другие вопросы по теме