Разберём устройство тестовых фреймворков. Спрограммируем свой тестовый фреймворк на примере PHPUnit. В нём как в реальном сделаем сканирование тестовых файлов, тестирование ожидаемых выбрасываемых исключений и написание параметризованных тестов с провайдерами данных с атрибутом DataProvider
.
Заодно отрефакторим полученный код, избавив его от нарушения инкапсуляции и от побочных эффектов записи результатов и прямого вывода на экран. Вынесем принтеры сводки и прогресса запуска и сделаем слабосвязанную архитектуру с использованием событий