Ruby on Rails. Как запустить автоматические тесты для загруженного пользователем файла Ruby? - PullRequest
0 голосов
/ 29 июня 2018

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

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

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

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

1 Ответ

0 голосов
/ 29 июня 2018

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

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

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

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

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

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

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

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

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

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

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

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

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