Nuevo en pytest...
Tengo lo siguiente en conftest.py para recopilar un argumento de equipo desde la línea de comando y leer en un archivo de configuración yaml:
import pytest import yaml def pytest_addoption(parser): parser.addoption( '--team', action='store', ) @pytest.fixture def team(request): return request.config.getoption('--team') @pytest.fixture def conf(request): with open('config.yml', 'r') as f: conf = yaml.load(f.read()) return confQuiero ejecutar una prueba en cada jugador dentro de conf[team]['players'] (una lista). Puedo hacerlo de la siguiente manera en test_players.py:
def test_players(team, conf): players = conf[team]['players'] for p in players: assert p == somethingEste tipo de obras, en el sentido de que itera a través de los jugadores, pero todo se trata como una sola prueba. Si algo falla, toda la prueba se trata como fallida. Me gustaría que cada jugador fuera evaluado por separado.
Si coloco los reproductores manualmente, puedo hacer que esto funcione:
import pytest class Test_Player(): @pytest.mark.parametrize( 'player', [ 'player1', 'player2', 'player3', ], ) def test_player(self, player): assert player == somethingAsí que mi problema es que no sé cómo pasar conf[team] a pytest.mark.parametrize. Los probé, pero en ambos casos se queja de que conf no está definido.
import pytest class Test_Player(): @pytest.mark.parametrize( 'player', conf[team]['players'], ) def test_player(self, player): assert player == somethingy
import pytest class Test_Player(team, conf): @pytest.mark.parametrize( 'player', conf[team]['players'], ) def test_player(self, player): assert player == something¿Que me estoy perdiendo aqui?
El problema con su configuración es que desea parametrizar en conf[team] , pero conf debe definirse en el momento de la importación , porque es cuando se ejecuta el decorador.
Por lo tanto, tendrá que realizar esta parametrización de manera diferente, utilizando las funciones de parametrización metafunc de pytest .
. ├── conftest.py ├── teams.yml └── test_bobs.pyEn el archivo yaml:
# teams.yml bobs: [bob1, bob2, potato] pauls: [paultato]En el módulo de prueba:
# test_bobs.py def test_player(player): assert 'bob' in playerEn la configuración de pytest:
import pytest import yaml def pytest_addoption(parser): parser.addoption('--team', action='store') def pytest_generate_tests(metafunc): if 'player' in metafunc.fixturenames: team_name = metafunc.config.getoption('team') # you can move this part out to module scope if you want with open('./teams.yml') as f: teams = yaml.load(f) metafunc.parametrize("player", teams.get(team_name, []))Ahora ejecuta:
pytest --team bobs Debería ver tres pruebas ejecutadas: dos pruebas aprobadas (bob1, bob2) y una prueba fallida (papa). El uso pytest --team pauls generará una prueba fallida. El uso pytest --team bogus dará como resultado una prueba omitida. Si desea un comportamiento diferente allí, cambie teams.get(team_name, []) a, por ejemplo, teams[team_name] .