У чому різниця між setUp () та setUpClass () у Python unittest?


99

У чому різниця між setUp()і setUpClass()в unittestфреймворці Python ? Чому налаштування обробляються одним методом над іншим?

Я хочу зрозуміти, яка частина налаштування виконується у функціях setUp()і setUpClass(), а також за допомогою tearDown()і tearDownClass().

Відповіді:


147

Різниця виявляється, коли у вас є більше одного методу тестування у вашому класі. setUpClassі tearDownClassзапускаються один раз для всього класу; setUpі tearDownвиконуються до і після кожного методу випробування.

Наприклад:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

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

Коли ви запускаєте цей тест, він друкує:

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(Точки ( .) є unittest«и вихід з замовчуванням , коли тест пройдено) . Зауважимо , що setUpі tearDownз'являються до і після , test1 і test2 , в той час як setUpClassі tearDownClassз'являються тільки один раз, на початку і в кінці всього тесту.


Чи не повинен бути такий порядок? : setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass
— Jai Sharma

Зверніть увагу на "." перед tearDown і відсутністю "." перед tearDownClass
— Джай Шарма

Ах, вибачте, не помітив цього. Ні, unittestне вважає тест витриманим, поки його tearDownне пройде без інцидентів.
— Бенджамін Ходжсон

Отже, кожен із методів test1 та test2 повинен мати свій власний набір setUp & tearDown, так? У вашій відповіді test1 не має жодного методу tearDown, і, отже, він повинен був надрукувати вихідні дані за замовчуванням (з.). Виправте мене, якщо я помиляюся.
— Джай Шарма

1
Результат у відповіді правильний. Я вставив його безпосередньо з виводу unittest. setUpі tearDownкожен раз запускати для кожного testметоду (так двічі в цілому в цьому прикладі) , але setUpClassі tearDownClassзапускаються тільки один раз.
— Бенджамін Ходжсон

15

У чому різниця між setUp()і setUpClass()в unittestфреймворці Python ?

Головна відмінність (як зазначено у відповіді Бенджаміна Ходжсона) полягає в тому, що setUpClassвикликається лише один раз, і це перед усіма тестами, тоді setUpяк викликається безпосередньо перед кожним тестом. (Примітка: Те саме стосується еквівалентних методів в інших тестових системах xUnit, а не тільки в Python unittest.)

З unittest документації :

setUpClass()

Метод класу, викликаний перед запуском тестів в окремому класі. setUpClass викликається з класом як єдиним аргументом і повинен бути оформлений як classmethod ():

@classmethod
def setUpClass(cls):
    ...

і:

setUp()

Метод, покликаний підготувати випробувальний прилад. Це викликається безпосередньо перед викликом методу тесту; крім AssertionError або SkipTest, будь-який виняток, викликаний цим методом, вважатиметься помилкою, а не помилкою тесту. Реалізація за замовчуванням нічого не робить.

Чому налаштування обробляються одним методом над іншим?

На цю частину запитання поки що немає відповіді. Відповідно до мого коментаря у відповідь на відповідь Gearon, setUpметод призначений для елементів кріплення, які є загальними для всіх тестів (щоб уникнути дублювання цього коду в кожному тесті). Я вважаю, що це часто корисно, оскільки видалення дублювання (як правило) покращує читабельність та зменшує навантаження на обслуговування.

setUpClassМетод для дорогих елементів , які ви хотіли б тільки зробити один раз, наприклад, відкриття з'єднання з базою даних, відкриттям тимчасового файлу в файлової системі, завантаженні поділюваних бібліотек для тестування і т.д. Робити такі речі перед кожним випробуванням буде уповільнити тестового набору занадто багато, тому ми просто робимо це один раз перед усіма тестами. Це незначне погіршення незалежності тестів, але необхідна оптимізація в деяких ситуаціях. Можна стверджувати, що не слід робити такі речі в модульних тестах, оскільки зазвичай можна знущатися над базою даних / файловою системою / бібліотекою / будь-чим, не використовуючи реальну річ. Як такий, я вважаю, що setUpClassце рідко коли потрібно. Однак корисно, коли тестування наведених вище прикладів (або подібних) стає необхідним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.