Skip to content

Raising error in unittest's setUpClass causes autograder breaking exception #40

@alexadkins

Description

@alexadkins

Describe the bug
Raising an Assertion Error in unittest's setUpClass method causes exception in jsontestrunner's getLeaderboardData

To Reproduce

import unittest
from gradescope_utils.autograder_utils.decorators import (
    weight,
    number,
    leaderboard,
)

class TestAutograder(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        raise AssertionError("compile for all tests failed")
        return super().setUpClass()
    
    @number(1.1)
    @weight(1)
    def test_01(self):
        "Test 01"
        pass

Expected behavior
Raised error would have populated results.json for all test cases of that class.

Instead, received following error:

The autograder produced the following output:

Traceback (most recent call last):
  File "/usr/lib/python3.10/unittest/suite.py", line 166, in _handleClassSetUp
    setUpClass()
  File "/autograder/source/tests/test.py", line 14, in setUpClass
    raise AssertionError("compile for all tests failed")
AssertionError: compile for all tests failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/autograder/source/run_tests.py", line 8, in <module>
    JSONTestRunner(visibility='visible',stdout_visibility='visible').run(suite)
  File "/usr/local/lib/python3.10/dist-packages/gradescope_utils/autograder_utils/json_test_runner.py", line 196, in run
    test(result)
  File "/usr/lib/python3.10/unittest/suite.py", line 84, in __call__
    return self.run(*args, **kwds)
  File "/usr/lib/python3.10/unittest/suite.py", line 122, in run
    test(result)
  File "/usr/lib/python3.10/unittest/suite.py", line 84, in __call__
    return self.run(*args, **kwds)
  File "/usr/lib/python3.10/unittest/suite.py", line 122, in run
    test(result)
  File "/usr/lib/python3.10/unittest/suite.py", line 84, in __call__
    return self.run(*args, **kwds)
  File "/usr/lib/python3.10/unittest/suite.py", line 114, in run
    self._handleClassSetUp(test, result)
  File "/usr/lib/python3.10/unittest/suite.py", line 176, in _handleClassSetUp
    self._createClassOrModuleLevelException(result, e,
  File "/usr/lib/python3.10/unittest/suite.py", line 236, in _createClassOrModuleLevelException
    self._addClassOrModuleLevelException(result, exc, errorName, info)
  File "/usr/lib/python3.10/unittest/suite.py", line 246, in _addClassOrModuleLevelException
    result.addError(error, sys.exc_info())
  File "/usr/local/lib/python3.10/dist-packages/gradescope_utils/autograder_utils/json_test_runner.py", line 136, in addError
    self.processResult(test, err)
  File "/usr/local/lib/python3.10/dist-packages/gradescope_utils/autograder_utils/json_test_runner.py", line 123, in processResult
    if self.getLeaderboardData(test)[0]:
  File "/usr/local/lib/python3.10/dist-packages/gradescope_utils/autograder_utils/json_test_runner.py", line 51, in getLeaderboardData
    column_name = getattr(getattr(test, test._testMethodName), '__leaderboard_column__', None)
AttributeError: '_ErrorHolder' object has no attribute '_testMethodName'

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions