Pytest собирает один и тот же тест несколько раз - PullRequest
0 голосов
/ 03 марта 2020

У меня есть тестовый файл с 3 тестами. Тестам нужен параметр, переданный через командную строку. При запуске pytest --serial-port [port name] написано " собрано 15 предметов ". Хотя должно быть только 3!

test_xyz.py

import os
import time
import serial
from plot import plot_file


def test_abc(serial_port):
    # test code here


def test_xyz(serial_port):
    # test code here


def test_pqr(serial_port):
    # test code here

conftest.py

def pytest_addoption(parser):
    parser.addoption("--serial-port", help="Target serial port")
    parser.addoption('--count', default=1, type='int', metavar='count',
                     help='Run each test the specified number of times')


def pytest_generate_tests(metafunc):
    if "serial_port" in metafunc.fixturenames:
        serial_port = metafunc.config.getoption("serial_port")
        if serial_port:
            metafunc.parametrize("serial_port", serial_port)
        else:
            raise EnvironmentError('Target serial port not specified. Use --serial-port [serial port]')

Среда: Python 3.8.1 Pytest 5.3.5

1 Ответ

3 голосов
/ 03 марта 2020

Вы, вероятно, используете pytest с последовательным портом, состоящим из 5 цифр, например:

pytest --serial-port 12345

И у вас есть 3 функции в вашем test_xyz.py.

Так что же происходит? Вы настраиваете последовательный порт, который является строкой. Тесты фактически выполняются со значениями от serial_port = "1" до serial_port = "5".

Эта строка в conftest.py приводит к вызовам тестов 5 * 3 раза.

metafunc.parametrize("serial_port", serial_port)

Вы можете изменить conftest на:

import pytest


def pytest_addoption(parser):
    parser.addoption("--serial-port", help="Target serial port")
    parser.addoption('--count', default=1, type='int', metavar='count',
                     help='Run each test the specified number of times')

@pytest.fixture(scope='session')
def serial_port(request):
    port = request.config.option.serial_port
    if port is None:
        pytest.skip()
    return port
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...