При использовании встроенного unittest Python существует как минимум два разных способа организовать настройки уровня класса, используя setUpClass()
или просто использовать члена класса старой школы. Когда использовать один, а когда другой?
class TestFoo(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.foo = Foo(...)
def test_blah(self):
self.foo.do_something()
...
В.С.
class TestFoo(unittest.TestCase):
foo = Foo(...)
def test_blah(self):
self.foo.do_something()
...
Фактически, 2 фрагмента в вышеприведенном вопросе работают в основном одинаково, за исключением случаев, когда вы собираетесь использовать декоратор @skipUnless(condition)
.
SETTINGS = json.load(...)
@unittest.skipUnless("foo" in SETTINGS, "skipped")
class TestFoo(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.foo = Foo(SETTINGS["foo"])
# If SETTINGS["foo"] is undefined,
# this entire test class would be skipped
В.С.
SETTINGS = json.load(...)
@unittest.skipUnless("foo" in SETTINGS, "skipped")
class TestFoo(unittest.TestCase):
foo = Foo(SETTINGS["foo"])
# This line will always be executed,
# BEFORE the skipUnless(...),
# so if SETTINGS["foo"] is undefined,
# there will be a runtime error here
setUpClass
также является процедурным и может делать больше, чем просто назначать атрибуты класса.