Skip to main content

pytest-grader

A pytest plugin for testing and scoring programming assignments.

Features

  • Assignment Scoring
    • Add point values to test functions using the @points(n) decorator
    • Show a score summary when running pytest --score
  • Test Locking as described in Basu et al., Automated Problem Clarification at Scale (abstract, pdf)
    • Lock doctests using the # LOCK comment before the function.
    • pytest-grader lock [src] [dst] will generate a copy of src with doctests locked.
    • pytest --unlock provides an interactive interface for unlocking locked doctests.
    • Doctests are ordinary doctests that pass under python3 -m doctest: an expected exception is written as its traceback, and a function value as its repr with ellipsis matching for the address, e.g. >>> make_adder(2) # doctest: +ELLIPSIS / <function make_adder.<locals>.adder at 0x...>.
    • Locking asks for what a student can predict: a traceback of any length is one answer, ERROR, and each function value is FUNCTION. When unlocking, type those (in any case). Directive comments are not shown. expected_outputs(example) gives the answers a locked example asks for, so tooling can show one blank per answer.
    • When unlocking, a string answer may be quoted with either single or double quotes (e.g. "hello" unlocks an expected 'hello'); the canonical form Python displays is recorded. An answer wrong only in its presence or absence of quotes is not accepted, but earns a hint saying so.
    • Unlocked outputs are saved in .unlocked.json (see --unlock-file) so that tests stay unlocked across pytest runs.
  • Test Isolation
    • Modules listed under reload_modules in grader.json are reloaded before each test, so a test that mutates a module (e.g. by monkeypatching one of its functions) does not affect later tests.
    • Globals injected by pytest's assertion rewriting (@py_builtins, @pytest_ar) are removed from doctest namespaces.
  • Test Timeouts
    • Each test (including each doctest) is limited to 10 seconds, so an infinite loop fails that test with a clear message instead of hanging the run. The remaining tests still run and are scored.
    • Adjust the limit with --timeout SECONDS; --timeout 0 disables it. The timeout is also disabled under --pdb.
    • Code blocked outside the Python interpreter (e.g. waiting on input() or a hung C call) cannot be interrupted; pure-Python loops always time out.

Usage

Include a conftest.py file in the distribution of your assignment that contains pytest_plugins = ["pytest_grader"].

Optionally describe the assignment in a grader.json file next to it:

{
  "reload_modules": ["hog"]
}

reload_modules lists modules reloaded before each test for isolation.

See the examples directory for more usage info.

License

MIT

Updating versions

  • Change version in pyproject.toml
  • uv build
  • uv publish If your pypi credentials are in ~/.pypirc, then instead run uvx uv-publish.

Metadata

Release files for pytest-grader 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytest-grader 0.4.0
File Size Uploaded
pytest_grader-0.4.0.tar.gz 21.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-grader 0.4.0
File Interpreter ABI Platform
pytest_grader-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 36.1 kB

Release files / pytest_grader-0.4.0.tar.gz

Download URL pytest_grader-0.4.0.tar.gz
Size 21.3 kB
Tags Source
SHA-256 checksum
How to use checksums
66765e9c6d8ec3681d3533ad17522b8a442ff8da3f703a4c4aa3399e30b79420
BLAKE2b-256 checksum
How to use checksums
00782441af1cde43098f87a8de87f998fcc4e077dc12e5aa154f73ed10c318ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.13

Release files / pytest_grader-0.4.0-py3-none-any.whl

Download URL pytest_grader-0.4.0-py3-none-any.whl
Size 14.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2ed948892db273e6de0b5167e552df9ea8b413081919abe6a9bd4a683476437b
BLAKE2b-256 checksum
How to use checksums
88d16bb236aa2eda2becd83baf4e445373f2f74139ebbb0cd43912f3544221c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.13

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page