Как сбить python unittest, если setUpClass выдает исключение

У меня мало проблем с использованием python setUpClass.

Например, рассмотрим следующий случай

class MyTest(unittest.case.TestCase):

    @classmethod
    def setUpClass(cls):
        print "Test setup"
        try:
            1/0
        except:
            raise

    @classmethod
    def tearDownClass(cls):
        print "Test teardown"

Несколько вопросов

  • Является ли приведенный выше код правильным способом обработки исключений тестового setUpClass (путем его повышения, чтобы python unittest мог позаботиться об этом), существуют методы fail(), skip(), но это может быть только используемые тестовыми экземплярами, а не тестовые классы.

  • Когда возникает исключение setUpClass, как мы можем гарантировать, что запускается tearDownClass (unittest не запускает его, если мы его вручную назовем).

Ответ 1

Вы можете вызвать tearDownClass для исключения, как указывает Джефф, но вы также можете реализовать метод __del__(cls):

import unittest

class MyTest(unittest.case.TestCase):

    @classmethod
    def setUpClass(cls):
        print "Test setup"
        try:
            1/0
        except:
            raise

    @classmethod
    def __del__(cls):
        print "Test teardown"

    def test_hello(cls):
        print "Hello"

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

Будет иметь следующий вывод:

Test setup
E
======================================================================
ERROR: setUpClass (__main__.MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "my_test.py", line 8, in setUpClass
    1/0
ZeroDivisionError: integer division or modulo by zero

----------------------------------------------------------------------
Ran 0 tests in 0.000s

FAILED (errors=1)
Test teardown

Примечание. вам следует знать, что метод __del__ будет вызываться в конце выполнения программы, что, возможно, не то, что вы хотите, если у вас более одного тестового класса.

Надеюсь, что это поможет