Проверка заданий с помощью утилиты pyneng

Начиная с раздела «4. Типы данных в Python» для проверки заданий используются автоматические тесты. Они помогают проверить все ли соответствует поставленной задаче, а также дают обратный отклик по тому, что не соответствует задаче. Как правило, после первого периода адаптации к тестам, становится проще делать задания с тестами.

Помимо перечисленных выше положительных моментов, в тестах также можно посмотреть какой итоговый результат нужен: прояснить структуру данных и мелочи, которые могут влиять на результат.

Для запуска тестов используется pyneng.py - скрипт, который находится в репозитории заданий.

Где решать задания

Задания надо выполнять в подготовленных файлах. Например, в разделе 04_data_structures есть задание 4.3. Чтобы выполнить его надо открыть файл exercises/04_data_structures/task_4_3.py и выполнять задание прямо в этом файле после описания задания.

Это важно потому что тесты привязаны к тому, что задания выполняются в определенных файлах и в определенной структуре каталогов. Кроме того, что задания надо делать в подготовленных файлах, обязательно скопировать себе весь каталог exercises (а еще лучше весь репозиторий pyneng-examples-exercises), так как тесты зависят от файлов в каталоге exercises, не только от файлов в каталоге конкретных заданий.

Установка скрипта pyneng

Для начала, его надо установить, чтобы не надо было каждый раз писать python pyneng.py.

Для установки скрипта, в репозитории должны находиться файлы pyneng.py и setup.py. Если репозиторий создавался после 28 января 2021 из шаблона pyneng-examples-exercises, эти файлы находится в корне репозитория. Иначе, их надо скопировать в свой репозиторий самостоятельно.

Надо перейти в свой репозиторий, например (пишите имя своего репозитория):

cd my_repo/

Затем внутри репозитория дать команду

pip install .

Это установит модуль и даст возможность вызывать его в любом каталоге по слову pyneng.

Скрипт pyneng

Этапы работы с заданиями:

  1. Выполнение заданий
  2. Проверка, что задание отрабатывает как нужно python task_4_2.py или запуск скрипта в редакторе/IDE
  3. Проверка заданий тестами pyneng 1-5
  4. Если тесты проходят, смотрим варианты решения pyneng 1-5 -a

Примечание

Второй шаг очень важен, потому что на этом этапе намного проще найти ошибки в синтаксисе и подобные проблемы с работой скрипта, чем при запуске кода через тест на 3 этапе.

Скрипт упрощает запуск тестов, так как не надо указывать никакие параметры, по умолчанию вывод настроен на подробный и запускается с плагином pytest-clarity, который улучшает diff при отличиях в решении и правильном решении. Также скрываются некоторые вещи, например, warning которые показывает pytest, чтобы не отвлекать от задачи.

Тесты по-прежнему можно запускать с помощью pytest, если вы уже к нему привыкли или ранее использовали. Скрипт pyneng всего лишь обертка вокруг запуска pytest.

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

Проверка заданий тестами

После выполнения задания, его надо проверить с помощью тестов. Для запуска тестов, надо вызвать pyneng в каталоге заданий. Например, если вы делаете 4 раздел заданий, надо находиться в каталоге exercises/04_data_structures/ и запустить pyneng одним из способов, в зависимости от того какие задания на проверять.

Запуск проверки всех заданий текущего раздела:

pyneng

Запуск тестов для задания 4.1:

pyneng 1

Запуск тестов для заданий 4.1, 4.2, 4.3:

pyneng 1-3

Если есть задания с буквами, например, в 7 разделе, можно запускать так, чтобы запустить проверку для заданий 7.2a, 7.2b (надо находиться в каталоге 07_files):

pyneng 2a-b

или так, чтобы запустить все задания 7.2x с буквами и без:

pyneng 2*

Получение ответов

Если задания проходят тесты, можно посмотреть варианты решения заданий.

Для этого к предыдущим вариантам команды надо добавить -a. Такой вызов значит запустить тесты для заданий 1 и 2 и скопировать ответы, если тесты прошли:

pyneng 1-2 -a

Тогда для указанных заданий запустятся тесты и для тех заданий из них, которые прошли тесты, скопируются ответы в файлы answer_task_x.py в текущем каталоге.

Вывод pyneng

Warning

В конце вывода теста часто написано «1 warning». Это можно игнорировать, предупреждения в основном связаны с работой каких-то модулей и скрыты чтобы не отвлекать от заданий.

Тесты прошли успешно

https://raw.githubusercontent.com/pyneng/pyneng.github.io/master/assets/images/ptest_output_5.png

Тесты не прошли

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

Отличия показываются как Left и Right, к сожалению тут нет такого что зеленым выделен правильный вариант, а красным неправильный, надо смотреть по ситуации. Каждый раз при выводе отличий, перед ними есть строка вида:

assert correct_stdout in out.strip()

В этом случае Left это правильный вывод, right вывод задания:

https://raw.githubusercontent.com/pyneng/pyneng.github.io/master/assets/images/ptest_output_1.png

или так:

return_value == correct_return_value

В этом случае Right это правильный вывод, Left вывод задания:

https://raw.githubusercontent.com/pyneng/pyneng.github.io/master/assets/images/ptest_output_2.png