Skip to content

fix: показывать вывод программы студента на панели «вывод»#370

Merged
fey merged 1 commit into
mainfrom
fix/output-panel-stdout
Jul 2, 2026
Merged

fix: показывать вывод программы студента на панели «вывод»#370
fey merged 1 commit into
mainfrom
fix/output-panel-stdout

Conversation

@fey

@fey fey commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Проблема

На панели «вывод» в уроках Python при успешном решении показывалась только точка ., а не результат работы кода студента (задание при этом засчитывалось).

Причина — сочетание двух факторов:

  • панель «вывод» отображает дословный stdout команды make test урока;
  • тесты «выводных» уроков перехватывали print() студента фикстурой capsys, а readouterr() поглощал этот вывод, нигде не перепечатывая. В связке с pytest ... -q (точка за пройденный тест) на панели оставалась только ..

Решение

После readouterr() вывод переиздаётся через with capsys.disabled(): print(out) — под --capture=no он идёт в реальный stdout и попадает на панель. assert выполняется после печати, поэтому вывод виден и при провале теста. Хелпер expect_output встроен прямо в файл теста — урок остаётся самодостаточным, без внешнего пакета.

Область изменений

Затронут 41 файл test_solution.py (уроки, где решение печатает вывод):

  • 38 уроков с выводом на верхнем уровне (runpy.run_moduleimportlib.import_module) — единый шаблон expect_output;
  • 3 особых: 35-calling-functions/270-deterministic (валидатор диапазона) и два, где тест вызывает функцию (40-define-functions/100-define-function, 50-loops/10-while) — там сохранён вызов функции + добавлено переиздание.

Не менялись: bin/test.sh, pyproject.toml, Dockerfile, функциональные уроки без print (выводить нечего), 10-basics/20-comments (вывод уже работал).

Проверка

  • вывод виден на всех типах уроков (Hello, World!, многострочные тексты, countdown, значение валидатора);
  • make compose-test — вся сюита зелёная;
  • make compose-code-lint (ruff) — All checks passed!.

🤖 Generated with Claude Code

Тесты перехватывали stdout студента фикстурой capsys и readouterr()
поглощал его, нигде не перепечатывая. В связке с pytest -q на панели
«вывод» при успехе оставалась только точка «.».

Теперь после readouterr() вывод переиздаётся через
`with capsys.disabled(): print(out)` — под --capture=no он идёт в реальный
stdout и попадает на панель. assert выполняется после печати, поэтому
вывод виден и при провале теста. Хелпер expect_output встроен прямо в
файл теста (урок самодостаточен).

Затронут 41 файл test_solution.py (уроки, где решение печатает вывод).
Функциональные уроки без print не менялись.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant