Skip to content

Latest commit

 

History

History
106 lines (75 loc) · 7.66 KB

File metadata and controls

106 lines (75 loc) · 7.66 KB

Task Checker

Build status

Библиотека для написания тестов для проверки решений задач на PHP. Пока на этапе демо-версии.

Пример теста можно увидеть в cli/run-test/scenario.php, в той же папке находятся примеры программ, которые проверяет этот тест.

Установка

Необходимо выполнить команду composer install.

Запуск в командной строке

Для демонстрации работы библиотеки используется скрипт cli/run-test.php, которому надо передать в аргументах файл сценария проверки и файл с проверяемой программой. Результаты проверки выводятся в консоль. Используется PHP 5.4+. Пример команды:

php cli/run-test.php cli/run-test/scenario.php cli/run-test/program1.php

Программа выводит в консоль текст в кодировке utf-8. Если под Windows этот текст не отображается, его можно сохранить в файл (дописав > result.txt к команде) и просмотреть файл редактором.

Запуск веб-приложения

У приложения имеется веб-интерфейс. Чтобы его увидеть, необходимо запустить встроенный в PHP веб-сервер командой:

php -S 127.0.0.1:9001 -t public public/index.php

После этого можно будет открыть в браузере страницу http://127.0.0.1:9001/ и увидеть список задач.

Юнит-тесты

В библиотеке есть несколько юнит-тестов, тестирующих внутренние компоненты библиотеки. Для их запуска необходимо использовать phpunit (проверено на phpunit 5.7), выполнив команду:

php phpunit.phar .

Разработка

В файле draft/syntax-ideas.php находятся разные идеи по ситаксису сценариев проверки.

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

К сожалению, в коде наблюдается нехватка комментариев. Принцип работы можно понять по скрипту cli/run-test.php. Создается объект-тестировщик, ему передается сценарий проверки, проверяемая программа, проводится проверка. На выходе получается отчет о проверке в объекте Report, который затем печатается.

Используется немного запутанная система DI, которая позволяет подключать модули внутри сценария проверки с помощью конструкций вида $this->moduleName, например, $this->assert создает объект класса Module\Assert. Идея взята из фреймворка Codeception.

Общая структура кода:

cli/               # Скрипты командной строки
public/            # Публичная папка веб-сервера
scenarios/         # Сценарии проверки задач
server/            # Конфигурация и код веб-приложения
src/
    Codebot/       # Заглушка, выполняющая код программы с помощью eval
    Errors/        # Объекты ошибок, обнаруживаемые тестами. Используются
                     для построения отчета о проверке
    Module/        # Модули, которые будут доступны внутри сценария 
                        проверки
    Promise/       # Внутренняя реализация Promise
    Reporter/      # Классы для сборки и вывода отчета о проверке
            Report.php    # Класс для сборки отчета. Отчет состоит из 
                              шагов, каждый из которых представлен отдельным 
                              объектом Step\Step. Шаги могут быть вложены 
                              друг в друга.
    Step/          # Классы, описывающие шаги теста
    Test/          # Классы, описывающие объект-тестировщик, проверяющий 
                      программу
    TextReader/    # Разбирает используемые в сценарии проверки выражения
    TextScanner/   # Классы для обработки и замены фрагментов кода на PHP, 
                        используются для подстановки значений переменных 
                        в программу.
    Util/
    Web/           # Классы, используемые в веб-приложении
    ModuleFactory.php    # Реализует DI в объекте-тестировщике
templates/         # Шаблоны страниц веб-приложения
tests/             # Автоматизированные тесты
  Helper/          # Вспомогательные классы для тестов

Сценарии проверки задач

Сценарии проверки хранятся в папке scenarios. Структура примерно такая:

scenarios/
        hello-world/          - идентификатор задачи (hello-world)
                  tester.php  - скрипт проверки решения
                  /fail/      - примеры неправильных решений
                      example1.php 
                      example2.php 
                  /pass/      - примеры правильных решений
                      example1.php
                      example2.php

Специальный тест (ScenariosIntegrationTest) тестирует все задачи и все варианты решений к ним, проверяя, что правильные решения проходят тест, а неправильные - нет.

Описания задач (названия, подсказки, и т.д.) хранятся в файле scenarios/problems.json. Этот файл автоматически генерируется из HTML страниц учебника со специальной HTML микроразметкой, которая описана в файле docs/problem-markup.md. Скрипты генерации находятся в папке cli.