This package provides some helper classes which assist in developing autograders
for the Gradescope autograder platform. These utilities work together to make it
easy to use Python's built in unittest
module for creating autograders that
work on Gradescope.
Decorators are provided for annotating test cases.
The @weight
decorator allows setting the point value of a test case. This
information is used by the JSONTestRunner in producing its output. This is
required for any tests which award points.
Example:
@weight(5.0)
def test_functionality():
...
The @tags
decorator allows setting tags on a test case. This is optional, but
may be used in the future to enable analytics on the concepts being tested in
programming assignments.
Example:
@tags("conditionals", "recursion")
def test_search():
...
The @visibility
decorator allows setting the visibility of a test case.
Example:
@visibility("after_due_date")
def test_search():
...
This utility class is a custom unittest test runner which produces JSON output
in the format that Gradescope's infrastructure expects. It works with test cases
annotated with the @weight
annotation to determine the point value of each
test case.
Example:
suite = unittest.defaultTestLoader.discover('tests')
with open('results.json', 'w') as f:
JSONTestRunner(stream=f, verbosity=2, buffer=True).run(suite)
This class is used by JSONTestRunner to format output in JSON.
Example output:
{
"output": "Printing inside a test case\n",
"score": 3,
"max_score": 3,
"name": "Test parsing a simple expression",
"tags": [
"parsing",
"lexing"
]
}
This allows for an integration between Django testing, which utilizes unittest and Gradescope's JSONTestRunner to obtain the JSON output of the Django test cases. To enable this, complete the following steps:
First, in your settings.py, insert the line:
`TEST_RUNNER = 'gradescope_utils.autograder_utils.gradescope_django_runner.GradescopeDjangoRunner'`
Then, within your run_autograder
, run the following command:
python3 manage.py test -v 0 > /autograder/results/results.json