Как вызвать setup один раз для всех тестов и разборки после того, как все закончено - PullRequest
14 голосов
/ 16 октября 2011

У меня есть куча тестов, написанных с использованием pytest.Есть все под каталогом dir.Например:

dir/test_base.py
dir/test_something.py
dir/test_something2.py
...

Упрощенная версия кода в них выглядит следующим образом:

test_base.py

import pytest

class TestBase:
   def setup_module(module):
      assert False

   def teardown_module(module):
      assert False

test_something.py

import pytest
from test_base import TestBase

class TestSomething(TestBase):
   def test_dummy():
       pass

test_something2.py

import pytest
from test_base import TestBase

class TestSomethingElse(TestBase):
   def test_dummy2():
       pass

Все мои test_something*.py файлы расширяют базовый класс в test_base.py.Теперь я написал setup_module(module) и teardown_module(module) методы в test_base.py.Я ожидал, что setup_module будет вызван один раз для всех тестов, и teardown_module() будет вызван в конце, когда все тесты будут завершены.

Но функции, кажется, не вызывают?Нужны ли декораторы, чтобы это работало?

Ответы [ 4 ]

4 голосов
/ 14 сентября 2015

Требованием OP было то, чтобы каждая настройка и демонтаж выполнялась только один раз , а не один раз на модуль. Это может быть выполнено с помощью комбинации conftest.py файла, @pytest.fixture (scope = "session") и передачи имени устройства в каждую тестовую функцию.

Они описаны в документации по Pytest

Вот пример:

conftest.py

import pytest

@pytest.fixture(scope="session")
    def my_setup(request):
        print '\nDoing setup'
        def fin():
            print ("\nDoing teardown")
        request.addfinalizer(fin)

test_something.py

def test_dummy(my_setup):
    print '\ntest_dummy'

test_something2.py

def test_dummy2(my_setup):
    print '\ntest_dummy2'

def test_dummy3(my_setup):
    print '\ntest_dummy3'

Вывод при запуске py.test -s:

collected 3 items 

test_something.py 
Doing setup

test_dummy
.
test_something2.py 
test_dummy2
.
test_dummy3
.
Doing teardown

Имя conftest.py имеет значение: вы не можете дать этому файлу другое имя и ожидать, что Pytest найдет его в качестве источника данных.

Установка scope = "session" важна. В противном случае настройка и демонтаж будут повторяться для каждого тестового модуля.

Если вы предпочитаете не передавать имя прибора my_setup в качестве аргумента тестовой функции, вы можете поместить тестовые функции в класс и применить к классу декоратор pytest.mark.usefixtures *. .

4 голосов
/ 08 января 2012

Поместите setup_module и teardown_module вне класса на уровне модуля. Затем добавьте ваш класс с вашими тестами.

def setup_module(module):
    """..."""

def teardown_module(module):
    """..."""

class TestSomething:

    def test_dummy(self):
        """do some tests"""

Для получения дополнительной информации обратитесь к этой статье .

1 голос
/ 18 октября 2011

setup_module / teardown_module вызывается для модуля, в котором определены возможные (производные) тесты. Это также позволяет настроить настройки. Если у вас есть только один setup_module, вы можете поместить его в test_base.py и импортировать из других мест. НТН.

0 голосов
/ 17 октября 2011

Во-первых, рекомендуется поместить все тесты в модуль под названием «тесты»:

<product>
   ...
   tests/
      __init__.py
      test_something.py

Во-вторых, я думаю, что вы должны использовать методы setup_class / teardown_class в базовом классе:

import unittest
class MyBase(unittest.TestCase):

   @classmethod
   def setup_class(cls):
       ...

   @classmethod
   def teardown_class(cls):
       ...

Подробнее: http://pytest.org/latest/xunit_setup.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...