Передача аргументов методам setup, teardown

pytest
python
Теги: #<Tag:0x00007fedbbcbfb28> #<Tag:0x00007fedbbcbf9e8>

(Roy Obenon) #1

Добрый день! Возникла такая ситуация что нужно передавать переменные в методы setup, teardown и мало того, переменные идут с фикстуры) Например:

@pytest.mark.parametrize(‘bd’)
def setup_module(module, bd)

вычитал, что setup, teardown запускаются до выполнения фикстур и типа в любом случае не получится подтянуть данные с фикстуры, кто нибудь сталкивался с такой пробл?


(ex3me0) #2

Из тестов передавать в фикстуры, или как?
Можете привести пример кода, чуть больший, чем 2 строки? Чтобы было понятно, что у вас есть, и что вы пытаетесь впихнуть в фикстуру.


(Roy Obenon) #3
pytest.mark.usefixtures('param')
def setup_module(param):
    delete_logs(param['path'])

class Test():
   def test1():
     ..........
   def test2():
     ..........

мне нужно , чтобы перед этими тестами делался прекондишн setup_module, но в нем метод получает параметр (param) передаваемый как опшн к вызову теста (напр. py.test test.py --path /home/logs), есть фикстура которая получает опшны, вот её вызов не клеится туда, потому что вначале вызывается setup_module а после его отработки уже подгружаются фикстуры, Как то так


(rmerkushin) #4

Тут посмотрите addoption http://doc.pytest.org/en/latest/example/simple.html


(ex3me0) #5

Да, мне кажется @rmerkushin прав, и вы чересчур все усложняете.

Вот мой пример:

conftest.py:

import pytest


def pytest_addoption(parser):
    parser.addoption("--file_to_check", action="store", help="EXE file to check")

test_check_file.py:

import pytest
import logging

logging.basicConfig(level=logging.DEBUG)

@pytest.fixture(scope="module", autouse=True)
def file_to_check(request):
    log = logging.getLogger('module_fixture')
    log.debug('Loaded!')
    
    return request.config.getoption("--file_to_check")

def test_exe_check(ftc='1'):
    log = logging.getLogger('test_exe_check')
    log.debug('File to check: %s' % ftc)
    assert ftc
    
def test_exe_check2(file_to_check):
    log = logging.getLogger('test_exe_check2')
    log.debug('File to check 2: %s' % file_to_check)
    assert file_to_check

Используется так:

py.test test_first -v -s --file_to_check 'FILE_TO_CHECK_PARAM!!!'

Вывод получается такой:

collected 2 items

test_first.py::test_exe_check 
DEBUG:module_fixture:Loaded!
DEBUG:test_exe_check:File to check: 1
PASSED

test_first.py::test_exe_check2 
DEBUG:test_exe_check2:File to check 2: 'FILE_TO_CHECK_PARAM!!!'
PASSED

Фикстура подгрузилась и автоматически заюзалась, как видно из дебаг-сообщений, еще на этапе первого теста, хотя там она была и не нужна. Справедливости ради - для этого она и была помещена в файл теста (что логично, если она будет использоваться только в рамках этого модуля).
Если у вас стоит задача очищать логи во время выполнения модуля (до выполнения первого теста) - по-идее это решает задачу.

Судя по документации - mark.usefixtures не получится юзать для пайтестовских setup/teardown_module, да и эти методы - скорее обратная совместимость с unittest (они собой и представляют более явные фикстуры)


(Roy Obenon) #6

Я это и так использую в conftest.py


(Roy Obenon) #7

Просто я думал, что в setup/teardown можно использовать остальные фикстуры, но увы! Ну да как вариант можно добавить фикстуру