Как заставить pytest запускать каждый тест (прекратить пропуск тестов, не отмеченных пропустить)? - PullRequest
0 голосов
/ 20 января 2019

Pytest, при запуске из командной строки, пропускает некоторые из моих параметризованных тестов, даже если я не велел это делать.Как ни странно, он не пропускает тесты при запуске с использованием палитры команд в VSCode.

Я пытался запускать тесты и тестовые файлы по отдельности и настраивать параметры командной строки, но все безрезультатно.Предположительно, есть некоторая тонкость конфигурации, которую я пропускаю.Вы можете помочь?

Пример теста

@pytest.mark.parametrize(
    "inputs, expec",
    helpers.get_samples('inouts/kmp'),
    ids=helpers.get_ids('inouts/kmp'))
def test_kmp(capsys, inputs, expec):
    """Sample test
    """
    with patch('kmp.sys.stdin', inputs):
        kmp.main()
    captured = capsys.readouterr()
    print(captured.err, file=sys.stderr)
    assert captured.out == expec.getvalue()

Вспомогательные функции (поддержка параметризации)

INGLOB = '*in*'
OUTGLOB = '*out*'

def _get_globs(path):
    """Collect input/output filename pairs
    """
    if not path.endswith("/"):
        path = path + "/"
    infiles = sorted(glob.glob(path + INGLOB))
    outfiles = sorted(glob.glob(path + OUTGLOB))
    assert [i.split('.')[0]
            for i in infiles] == [o.split('.')[0] for o in outfiles]
    return zip(infiles, outfiles)


def get_samples(path):
    """Reads sample inputs/outputs into StringIO memory buffers
    """
    files = _get_globs(path)
    inputs_outputs = []
    for infile, outfile in files:
        with open(infile, 'r') as f1:
            inputs = StringIO(f1.read())
        with open(outfile, 'r') as f2:
            outputs = StringIO(f2.read())
        inputs_outputs.append(tuple([inputs, outputs]))
    return inputs_outputs


def get_ids(path):
    """Returns list of filenames as test ids
    """
    return [f for f, _ in _get_globs(path)]

Запуск этого проекта в VSCode из палитры команд дает:

platform darwin -- Python 3.7.2, pytest-4.1.0, py-1.7.0, pluggy-0.8.1
rootdir: ... , inifile:
plugins: cov-2.6.1
collected 79 items

test_1.py ........................................         [ 50%]
test_2.py ...................................              [ 94%]
test_3.py ....                                             [100%]

generated xml file: 
/var/folders/pn/y4jjr_t531g3x3v0s0snqzf40000gn/T/tmp-...
========================== 79 passed in 0.55 seconds ===========================

Но выполнение тех же тестов из командной строки приводит к:

=============================== test session starts ===============================
platform darwin -- Python 3.7.2, pytest-4.1.0, py-1.7.0, pluggy-0.8.1
rootdir: ... , inifile:
plugins: cov-2.6.1
collected 59 items

test_1.py ssss...................s.....                           [ 49%]
test_2.py s.......................ss.s                            [ 96%]
test_3.py s.                                                      [100%]

====================== 49 passed, 10 skipped in 0.42 seconds ======================

Как получить pytest для сбора и запуска полных 76 элементов?Я не использую никаких специальных опций в VSCode.Я не понимаю, почему pytest пропускает тесты, когда мне не говорят об этом.

Спасибо!

1 Ответ

0 голосов
/ 22 января 2019

pytest автоматически «пропустит» тесты, которые параметризованы, но не имеют записей.

Самый простой пример:

@pytest.mark.parametrize('a', ())
def test(a): pass

и вывод

$ pytest -v t.py 

...

t.py::test[a0] SKIPPED                                                    [100%]

=========================== 1 skipped in 0.02 seconds ===========================

yourПроблема здесь, вероятно, в двух средах выполнения: либо текущий рабочий каталог, либо что-то подобное, заставляет ваш сбор данных возвращать нулевые результаты в вашем терминале, но фактические результаты при запуске из vscode.Я бы проверил ваш текущий рабочий каталог и virtualenv, который вы активировали первым, и отладил оттуда.Может быть, даже поставить точку останова внутри get_samples / get_ids.

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