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
.