47

I am doing some unittests with python and some pre-test checks in setUpClass. How can I throw a unitest-fail within the setUpClass, as the following simple example:

class MyTests(unittest.TestCase):

    @classmethod
    def setUpClass(cls):    
        unittest.TestCase.fail("Test")

    def test1(self):
        pass

if __name__ == '__main__':
    unittest.main()

gives the error TypeError: unbound method fail() must be called with TestCase instance as first argument (got str instance instead).

I understand the error I get as fail is a instance method, and I don't have an instance of MyClass yet. Using an instance on-the-fly like

unittest.TestCase().fail("Test")

also does not work, as unittest.TestCase itself has no tests. Any ideas how to fail all tests in MyClass, when some condition in setUpClass is not met?

Followup question: Is there a way to see the tests in setUpClass?

Alex
  • 41,580
  • 88
  • 260
  • 469
  • it is also possible to skip test (for anyone who do not want to have a fail and still test the rest): https://stackoverflow.com/questions/2066508/disable-individual-python-unit-tests-temporarily – Marine Galantin Jan 24 '21 at 13:56

3 Answers3

68

self.fail("test") put into your setUp instance method fails all the tests

I think the easiest way to do this at the class level is to make a class variable so something like:

@classmethod
def setUpClass(cls):
   cls.flag = False

def setUp(self):
   if self.flag:
       self.fail("conditions not met")

Hope this is what you want.

Stephen
  • 2,365
  • 17
  • 21
  • for some reason sonarqube does not accept the self.fail line. for me it says that it's not covered by tests. – Ema Il Jul 11 '22 at 15:22
50

Using a simple assert should work

assert False, "I mean for this to fail"
Greg
  • 5,422
  • 1
  • 27
  • 32
2

I'm not an expert in python but with same problem, I've resolved adding cls param:

...
    @classmethod
    def setUpClass(cls):
        cls.fail(cls, "Test") 
...

I think is strange but clearer.

When you pass cls, warning appear (Expected type 'TestCase', got 'Type[MyTests]' instead) and MyTests inherits from TestCase thus can ignoring adding: # noinspection PyTypeChecker

arkadiont
  • 29
  • 4