with what tutorial para framework español develop applications python pytest

python - what - Cómo pasar argumentos en pytest por línea de comando



tutorial de django (4)

De acuerdo con el documento oficial , el decorador de la marca debe verse como abajo.

@pytest.mark.parametrize("arg1", ["StackOverflow"]) def test_mark_arg1(arg1): assert arg1 == "StackOverflow" #Success assert arg1 == "ServerFault" #Failed

correr

python -m pytest <filename>.py

  • Nota 1: el nombre de la función debe comenzar con test_
  • Nota2: pytest redireccionará stdout (print) , por lo que directamente ejecutando stdout no podrá mostrar ningún resultado en la pantalla. Además, no es necesario imprimir el resultado en su función en los casos de prueba.
  • Nota3: pytest es un módulo ejecutado por python, que no puede obtener sys.argv directamente

Si realmente desea obtener argumentos configurables externos, debe implementarlos dentro de su script. (Por ejemplo, cargando contenido de archivo)

with open("arguments.txt") as f: args = f.read().splitlines() ... @pytest.mark.parametrize("arg1", args) ...

Tengo un código y necesito pasar los argumentos como nombre de terminal. Aquí está mi código y cómo pasar los argumentos. Recibo un error de tipo "Archivo no encontrado" que no entiendo.

He intentado el comando en la terminal: pytest <filename>.py -almonds Debería imprimir el nombre como "almendras"

@pytest.mark.parametrize("name") def print_name(name): print ("Displaying name: %s" % name)


En su prueba pytest, no use @pytest.mark.parametrize :

@pytest.mark.unit def test_print_name(name): print ("Displaying name: %s" % name)

En conftest.py :

def pytest_addoption(parser): parser.addoption("--name", action="store", default="default name") def pytest_generate_tests(metafunc): # This is called for every test. Only get/set command line arguments # if the argument is specified in the list of test "fixturenames". option_value = metafunc.config.option.name if ''name'' in metafunc.fixturenames and option_value is not None: metafunc.parametrize("name", [option_value])

Luego, puede ejecutar desde la línea de comando con un argumento de línea de comando:

pytest -s tests/my_test_module.py --name abc


Me tropecé aquí buscando cómo pasar una discusión, pero quería evitar parametrizar la prueba. Las respuestas anteriores responden perfectamente a la pregunta exacta de parametrizar una prueba desde la línea de comandos, pero me gustaría ofrecer una forma alternativa de pasar un argumento de línea de comandos a pruebas particulares. El método a continuación utiliza un dispositivo y omite la prueba si el dispositivo está especificado pero el argumento no es:

# test.py def test_name(name): assert name == ''almond'' # conftest.py def pytest_addoption(parser): parser.addoption("--name", action="store") @pytest.fixture(scope=''session'') def name(request): name_value = request.config.option.name if name_value is None: pytest.skip() return name_value

Ejemplos:

$ py.test tests/test.py =========================== test session starts ============================ platform linux -- Python 3.7.1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0 rootdir: /home/ipetrik/dev/pytest_test, inifile: collected 1 item tests/test.py s [100%] ======================== 1 skipped in 0.06 seconds ========================= $ py.test tests/test.py --name notalmond =========================== test session starts ============================ platform linux -- Python 3.7.1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0 rootdir: /home/ipetrik/dev/pytest_test, inifile: collected 1 item tests/test.py F [100%] ================================= FAILURES ================================= ________________________________ test_name _________________________________ name = ''notalmond'' def test_name(name): > assert name == ''almond'' E AssertionError: assert ''notalmond'' == ''almond'' E - notalmond E ? --- E + almond tests/test.py:5: AssertionError ========================= 1 failed in 0.28 seconds ========================= $ py.test tests/test.py --name almond =========================== test session starts ============================ platform linux -- Python 3.7.1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0 rootdir: /home/ipetrik/dev/pytest_test, inifile: collected 1 item tests/test.py . [100%] ========================= 1 passed in 0.03 seconds =========================


Use la función de enganche pytest_addoption en conftest.py para definir una nueva opción.
Luego, utiliza el dispositivo pytestconfig en un dispositivo propio para obtener el nombre.
También puede usar pytestconfig de una prueba para evitar tener que escribir su propio dispositivo, pero creo que tener la opción de tener su propio nombre es un poco más limpio.

# conftest.py def pytest_addoption(parser): parser.addoption("--name", action="store", default="default name")

# test_param.py import pytest @pytest.fixture() def name(pytestconfig): return pytestconfig.getoption("name") def test_print_name(name): print(f"/ncommand line param (name): {name}") def test_print_name_2(pytestconfig): print(f"test_print_name_2(name): {pytestconfig.getoption(''name'')}")

# in action $ pytest -q -s --name Brian test_param.py test_print_name(name): Brian .test_print_name_2(name): Brian .