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
- Add point values to test functions using the
- Test Locking as described in Basu et al., Automated Problem Clarification at Scale (abstract, pdf)
- Lock doctests using the
# LOCKcomment before the function. pytest-grader lock [src] [dst]will generate a copy of src with doctests locked.pytest --unlockprovides an interactive interface for unlocking locked doctests.- A doctest whose output is a function should give
FUNCTIONas the expected output, which matches any function value. When unlocking, typeFUNCTIONfor such outputs.
- Lock doctests using the
- Test Isolation
- Modules listed under
reload_modulesingrader.yamlare 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.
- Modules listed under
- Progress Logging
- Each pytest session is recorded in a
grader.sqlitedatabase: the pytest command (pytestplus the arguments pytest received, however it was launched), a timestamp, and snapshots of the assignment files at that time. - Test case results and unlocking attempts are stored there as well, linked to their session's snapshot.
- This file is designed to be submitted along with the assignment as a record of how the assignment was completed.
- Each pytest session is recorded in a
Usage
Include a conftest.py file in the distribution of your assignment that contains pytest_plugins = ["pytest_grader"].
Describe the assignment in a grader.yaml file next to it:
included_files: # Files snapshotted into grader.sqlite when tests run
- hog.py
reload_modules: # Modules reloaded before each test for isolation
- hog
See the examples directory for more usage info.
License
Updating versions
- Change version in
pyproject.toml uv builduv publishIf your pypi credentials are in~/.pypirc, then instead runuvx uv-publish.
Metadata
Release files for pytest-grader 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pytest_grader-0.1.9.tar.gz | 17.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pytest_grader-0.1.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.2 kB
Release files / pytest_grader-0.1.9.tar.gz
| Download URL | pytest_grader-0.1.9.tar.gz |
|---|---|
| Size | 17.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c692b9ae44ef96bc9cb07d8b76620220ada9eec1d0d73b3c1e0a3eabc1d0f5b5
|
|
BLAKE2b-256 checksum How to use checksums |
6d1d7919fcd1693df14b30dcaea6739bc7ded8d04b65b2f4bc3dd59973bfb51b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.13
|
Release files / pytest_grader-0.1.9-py3-none-any.whl
| Download URL | pytest_grader-0.1.9-py3-none-any.whl |
|---|---|
| Size | 13.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d2a833dd3bb9a4671f9d0c2b95111f6cf952758d014088aacdf760d17753f33f
|
|
BLAKE2b-256 checksum How to use checksums |
3f500924072bac3cc9cf927af7ab6eab4534ae1b077d83896457de6c4b69d06f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.13
|